4.3.0
Pre-release
Pre-release
Plugin System Overhaul & Native Module Support
Added
- Native module support in external plugins — external plugins can now depend on native npm packages (
.nodebinaries); the app automatically runsnpm installfollowed byelectron-rebuildto recompile native modules against the correct Electron ABI, with a.rebuiltmarker to skip redundant rebuilds on subsequent launches. - Folder-based external plugins — plugins can now ship as a directory (
plugin-name/index.js) instead of a single.jsfile, enabling plugins to include aworker.js,package.jsonwith dependencies, and amanifest.jsonwith metadata. - Worker thread support for external plugins — if a folder plugin includes a
worker.js, it is automatically launched in aWorkerthread (same pattern as the builtin hardware plugin), allowing CPU-intensive work to run off the main thread. - Per-plugin persistent storage —
PluginContextnow exposeswriteConfig(name, data)and a smartreadConfig(name)that reads fromplugins-data/{pluginId}/first, falling back to shareduserDataconfigs (buttons,imageCycles, etc.). - Plugin enabled state persistence — external plugins now persist their enabled/disabled state across restarts via
external-plugins-state.json; state is restored onstartAllwithout needing a manual settings entry per plugin. pluginDirin PluginContext — plugins receive the path to their own folder viactx.pluginDir, enabling them to resolve local worker scripts, assets, or config files relative to themselves.- GitHub-based plugin installation —
voidpresence://install-plugin?zip=<github-tree-url>now downloads a folder plugin directly from GitHub via the Contents API (no zip required), with amarkPluginInstallingflag that prevents the file watcher from firing prematurely. - Button cycles in hardware plugin — the builtin hardware plugin now supports
getNextButtonsandreadButtonsConfig, cycling through button pairs the same way the default plugin does. - Bar style moved to plugin controls — the bar style selector is now a
selectcontrol on the hardware plugin card instead of a standalone section on the main config page. - More Plugins card on plugins page — a new card at the bottom of the plugins view links to
voidpresence.site/plugins(browse community plugins) and the GitHub plugins folder (submit your own). shell:open-externalIPC — a genericopenExternal(url)API is now available in the renderer for opening any validatedhttps://URL in the system browser.
Improved
startAllPluginsno longer blocks IPC registration — plugin loading (includingnpm installandelectron-rebuild) now runs in the background viavoid startAllPlugins(), so IPC handlers register immediately and the renderer never gets "no handler registered" errors on startup.spawn EINVALfix on Windows —npm installandelectron-rebuildnow usenpm.cmd/npx.cmdwithshell: falseon Windows, eliminating theEINVALandDEP0190errors caused by passing.cmdexecutables withshell: trueand an args array.- Watcher extended to folder plugins —
startPluginsWatchernow handles both.jsfiles and directory-based plugins, triggering hot-load or unload correctly when a folder is added or removed from thepluginsdirectory. - hardware-native external plugin — a new external plugin using
systeminformationreplaceswmic/powershell/nvidia-smicalls; CPU load usesos.cpus()diff (no WMI), RAM usesos.totalmem/freemem, GPU stats are cached for 30 seconds, cutting CPU usage significantly. - All plugin manager log messages localized — every
sendLogandsendToastcall inplugin-manager.tsand the install handler inipc.tsnow goes throught()with keys inen,ru, andtrlocales.
Web (voidpresence.site)
- Plugins page card redesign — plugin cards now match the status card style exactly: Discord-style preview with animated cycling slides, author GitHub avatar fetched server-side (SSR, 24h cache), progress bar, and dot indicators.
build:manifestscript —node scripts/build-manifest.jsauto-generatesplugins-manifest.jsonby scanning theplugins/folder and extracting metadata (author,description,tags,preview.slides) directly frommodule.exportsin each plugin file.- Folder plugin support in manifest — folder plugins get a
"folder": trueflag and a GitHub treesourceUrl; the install button sends?zip=<tree-url>to the deep link handler. - Server-side GitHub avatar fetch — author avatars are resolved on the server in
page.tsxusing the GitHub API before the page is sent to the client, eliminating avatar fetch waterfalls in the browser.