{"id":51034115,"url":"https://github.com/gyng/widgetsack","last_synced_at":"2026-06-22T03:31:31.315Z","repository":{"id":159249553,"uuid":"634586106","full_name":"gyng/widgetsack","owner":"gyng","description":"Themable desktop widget overlay for Windows. System meters, clocks, now playing, Home Assistant via a visual editor. Tauri + React.","archived":false,"fork":false,"pushed_at":"2026-06-13T22:05:09.000Z","size":24395,"stargazers_count":2,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-13T22:17:22.201Z","etag":null,"topics":["desktop-customization","desktop-overlay","desktop-widgets","hardware-monitoring","home-assistant","mqtt","now-playing","rainmeter","rainmeter-alternative","react","rust","system-monitor","tauri","typescript","widgets","windows"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gyng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2023-04-30T16:01:05.000Z","updated_at":"2026-06-13T22:05:10.000Z","dependencies_parsed_at":"2023-07-25T20:49:55.083Z","dependency_job_id":null,"html_url":"https://github.com/gyng/widgetsack","commit_stats":null,"previous_names":["gyng/nowplaying-widget"],"tags_count":42,"template":false,"template_full_name":null,"purl":"pkg:github/gyng/widgetsack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyng%2Fwidgetsack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyng%2Fwidgetsack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyng%2Fwidgetsack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyng%2Fwidgetsack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gyng","download_url":"https://codeload.github.com/gyng/widgetsack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gyng%2Fwidgetsack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34633796,"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-22T02:00:06.391Z","response_time":106,"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":["desktop-customization","desktop-overlay","desktop-widgets","hardware-monitoring","home-assistant","mqtt","now-playing","rainmeter","rainmeter-alternative","react","rust","system-monitor","tauri","typescript","widgets","windows"],"created_at":"2026-06-22T03:31:30.684Z","updated_at":"2026-06-22T03:31:31.306Z","avatar_url":"https://github.com/gyng.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \u003cimg src=\"branding/icon-transparent.png\" alt=\"\" width=\"40\" align=\"top\"\u003e widgetsack\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/img/demo.png\" alt=\"widgetsack demo layout: clock, CPU/GPU gauges, a countdown timer, memory/VRAM bars, up/down network graphs, an audio spectrum, a now-playing card, a stock ticker, an analog clock, Home Assistant temperature/climate/light tiles, and a DDC monitor input switcher\" width=\"900\"\u003e\n\u003c/p\u003e\n\n[**👉 installer download for the latest release**](https://github.com/gyng/widgetsack/releases/latest)\n\nA themable desktop widget overlay for Windows.\n\nPut system meters (CPU, per-core, GPU/VRAM, memory, network), clocks, and the currently-playing track on a transparent, click-through overlay across all your monitors and arrange them with a\nbuilt-in visual editor. Widgets follow a sensor + meter model but the layout is a live CSS-flow editor, styling is plain CSS + design\ntokens, and it ships with Home Assistant, MQTT, and stock-quote integrations.\n\n## Widget gallery\n\nSee: [**widget reference**](docs/widgets.md) · [**templating \u0026 formulas**](docs/templating.md) · [**theming**](docs/theming.md)\n\nThe screenshots regenerate from the registry: `npm run gen:gallery` (in `client/`); both reference\ndocs regenerate from the code with `npm run gen:docs`.\n\n## Layout studio\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/img/studio.png\" alt=\"widgetsack studio: the layout editor showing the demo layout on the stage, the section nav, the canvas toolbar, and the widget inspector\" width=\"900\"\u003e\n\u003c/p\u003e\n\n## Features\n\n- **Widgets:** gauges, bars, sparklines, text, digital + analog clocks, a month calendar, a per-core\n  CPU grid, a GPU panel, a battery indicator, a disk/storage panel, a top-process monitor, an audio\n  spectrum, a now-playing card, a weather card, a stock ticker, an application fence or zone, a web\n  iframe, action buttons, a DDC monitor input switcher, an audio output switcher, and Home Assistant\n  tiles — sensor- or [formula-driven](docs/templating.md)\n  and fully restylable ([reference](docs/widgets.md)).\n- **Sensors:** CPU (total/per-core/freq), memory + swap, network, disks (+ I/O), uptime, battery, the\n  busiest process (by CPU/RAM/disk/GPU), and NVIDIA GPU (NVML) — demand-gated, so only what's on screen\n  is sampled.\n- **Now playing:** Windows media via GSMTC — Spotify, foobar2000, browsers, and more\n  ([support table](https://github.com/ModernFlyouts-Community/ModernFlyouts/blob/main/docs/GSMTC-Support-And-Popular-Apps.md)).\n- **Integrations:** Home Assistant (live states + light/climate/fan/cover/lock/scene/switch/media\n  controls), MQTT, stock quotes, and\n  weather (Open-Meteo, keyless).\n- **Overlay:** transparent, click-through, always-on-top, one per monitor — per-widget\n  click-through still lets buttons/controls catch clicks. Single-instance, optional autostart.\n- **Studio:** visual editor — drag/resize/snap a CSS-flow layout, browse sensors, build reusable\n  widgets, edit themes, import/export \"sacks\". `Ctrl+Alt+E`; live-reloaded `widgets.json`.\n- **Templates:** one-click starter groups (clock, system, network, now-playing) recreated from\n  classic Rainmeter skins.\n- **Macros:** bind a button to a sequence of actions (HA service calls, media transport).\n- **Plugin packages:** drop-in template/theme bundles from the community — declarative, opt-in,\n  scanned ([authoring guide](docs/third-party-plugins.md)).\n- **Theming:** per-widget CSS (highlighting/linting editor), design-token themes (one for every\n  monitor, or a different theme per monitor), system fonts.\n- **Window zones:** define snap regions and drag any app's window — including custom-titlebar apps\n  like Electron/UWP — into them, or auto-arrange open windows by rule.\n- **Perfect for secondary and side monitors**: Corsair Xeneon Edge, Lamptron, Turzx, etc.\n- Built with Tauri + React.\n\n## Coming from Rainmeter?\n\nwidgetsack is a web-first take on what a widget suite does — system meters, clocks, now-playing, and a transparent always-on-top overlay — with a few differences:\n\n- **Higher memory usage**: as this is a web and browser-based overlay each monitor with active widgets will take a minimum of 100MB of RAM and 40MB of VRAM\n- **Sensor + meter instead of `.ini`:** the same measure→meter idea (a sensor feeds a meter), but you\n  wire it in a visual **studio** instead of hand-editing config files. Layout is CSS flexbox and\n  styling is plain per-widget CSS + design tokens.\n- **Built-in skins as templates:** the bundled templates recreate classic skin layouts and drop in\n  with one click; build your own reusable widgets in the widget designer.\n- **Built-in sources:** beyond local system sensors, pull in Home Assistant, MQTT, and live stock\n  quotes.\n- **Layout containers**: Grids, rows, columns and floating widgets that use HTML and CSS for styling\n\n## Usage\n\nDownload the installer from the [latest release](https://github.com/gyng/widgetsack/releases/latest).\n\nThe overlay starts passive (click-through). To arrange widgets:\n\n1. **Enter edit mode** — the tray icon's **\"Edit layout\"**, or press **`Ctrl+Alt+E`**.\n2. Drag widgets to move, drag the handles to resize. Use the **palette** (bottom-left) to\n   add widgets and the **inspector** to edit a selected widget's sensor / position / config.\n3. **Exit edit mode** the same way. The layout saves to `widgets.json` (in the app config\n   dir) and reloads automatically if you hand-edit that file.\n\n### Theming\n\nEach widget can take a CSS override. Eg, to turn images grayscale:\n\n```css\nimg {\n  filter: grayscale(1);\n}\n```\n\n### Now playing — source priority\n\nIf multiple audio sources are active, a priority list of executable names decides which to\nshow (reachable in edit mode; \"All media\" lists the current sources).\n\n### Autostart\n\nToggle autostart in settings, or add `widgetsack.exe` to Startup apps in Task Manager.\n\n## Plugins\n\nwidgetsack has two plugin layers, both managed from the studio's **Plugins** section:\n\n- **Built-in integrations** — Home Assistant, MQTT, stock quotes, and the AI provider are\n  first-party plugins configured in the studio. Tokens and API keys stay in the Rust backend;\n  the webview never holds them.\n- **Third-party plugin packages** — drop-in community bundles that add **templates**\n  (ready-made widget clusters with insert-time options), optionally a **theme**, and optionally\n  a **sandboxed sensor source**: a small `source.js` that polls an HTTP API and feeds custom\n  sensors you can bind to any meter or formula as `pkg.\u003cid\u003e.*`.\n\nInstall a package by dropping its folder into the app-config `plugins/` directory, or via\n**Plugins → Packages → Install from URL…** — paste `owner/repo`, a GitHub link, or any https\n`plugin.json` URL. Update checks are manual (per-package *Check updates*); nothing is fetched in\nthe background.\n\nPackages are opt-in and sandboxed by design:\n\n- **Nothing runs on install.** Every package lands disabled; enabling it is a per-machine\n  allowlist, and re-installing starts from zero trust.\n- **Templates and themes are declarative data** — a package can't ship its own components. The\n  only code surface is `source.js`, which runs in a QuickJS-in-WASM sandbox with zero\n  capabilities: no network, no DOM, no Tauri, a ~100 ms CPU budget per tick.\n- **The host does the fetching** against a Rust-enforced https allowlist of exact hostnames the\n  manifest declares — consented by name on first enable, re-confirmed if an update changes the\n  list.\n- **Theme CSS is the trust boundary:** it's scanned (remote `url()`/`@import`, viewport\n  overlays), and a flagged theme asks for explicit confirmation. Don't enable packages from\n  sources you don't trust.\n\nTo write one, see the [authoring guide](docs/third-party-plugins.md) and the reference\n[sample pack](examples/packages/sample-pack) — a parameterized clock template, a weather card\ndriven by a sandboxed [open-meteo](https://open-meteo.com) source, and a small theme, CI-tested\nagainst the real pipeline on every build.\n\n## Development\n\nBuild/run instructions, the test gates, and the release process live in\n[docs/development.md](docs/development.md). The architecture and roadmap are in\n[docs/widget-platform.md](docs/widget-platform.md).\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or\n  \u003chttp://www.apache.org/licenses/LICENSE-2.0\u003e)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or \u003chttp://opensource.org/licenses/MIT\u003e)\n\nat your option.\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall be\ndual licensed as above, without any additional terms or conditions.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"branding/icon-transparent.png\" alt=\"widgetsack logo — a maneki-neko holding a money sack and a little CRT\" width=\"168\" height=\"168\"\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgyng%2Fwidgetsack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgyng%2Fwidgetsack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgyng%2Fwidgetsack/lists"}