Skip to content

Changelog

[0.9.9.0-beta] - 2026-07-04

📅 04th July, 2026

Added

  • Added text selection support for Text elements with textSelection, selectionBackgroundColor, and selectionTextColor.
  • Added the Direct2D-rendered InputBox UI element via ui.addInputBox.
  • Added hidden and dashed support to LayoutBox borderStyle.

[0.9.8.0-beta] - 2026-06-17

📅 17th June, 2026

Added

  • Added support for "double" border style to LayoutBox border system.
  • Added flexDirection property ("row", "rowreverse", "column", "columnreverse") to LayoutBox to configure modern flexbox flow layouts.
  • Added display property ("flex", "none", "list-item") to LayoutBox to manage layout and visibility.
  • Added support for hyphenated CSS-like formats (e.g. "left-top", "center-center") and "middle" aliases for textAlign property on Text elements.

Removed

  • Removed minWidth and minHeight properties from LayoutBox elements.

[0.9.7.0-beta] - 2026-06-02

📅 2nd June, 2026

Added

  • Added new app.storage persistent JSON storage API:
    • app.storage.get(key[, defaultValue]) - retrieves stored values or returns default fallback
    • app.storage.set(key, value) - stores key-value pairs persistently in storage.json
    • app.storage.remove(key) - deletes key-value pairs from persistent storage
  • Added LayoutBox container element (ui.addLayoutBox and ui.layoutBox) supporting layout direction (row/column), alignment, padding, gaps, and nested composition of children.
  • Enhanced LayoutBox border system with support for CSS-like borderStyle properties, allowing "solid", "none", "inset", "outset", "groove", "ridge", and "dotted" borders, customized globally or per-side.
  • Introduced ui.animate(options) API for animating UI element properties:
    • Keyframe timeline animations via keyframes property (supports array syntax and percentage-key object syntax).
    • Tween animations supporting starting states via from property.
    • Loop control using iterationCount (can be a number or "infinite").
    • Typography property animation (fontSize, fontWeight, letterSpacing, fontColor) on Text elements inside keyframe timelines.

[0.9.6.0-beta] - 2026-05-21

21st May, 2026

Added

  • Added system.cpu.getUpTime(...) to the system module CPU API.

Improved

  • Improved isTrackedElement with recursive search to support safer validation for nested child elements.
  • Updated InputBox addon to support small width and height values.

Fixed

  • Fixed a critical engine crash in HandleMouseMessage caused by dangling element pointers when elements were deleted during JS event callbacks.
  • Fixed Manage Novadesk window lifecycle so it exits automatically when Novadesk closes.
  • Fixed QuickJS UI IPC listener ownership by binding ipcRenderer.on callbacks to the active __filename script path, ensuring stale widget listeners are cleared on refresh and preventing duplicate update flicker.

[0.9.5.0-beta] - 2026-05-15

📅 15th May, 2026

Improved

  • Optimized widget engine script loading (AddScript) to be non-destructive. Adding new scripts no longer triggers a global runtime reset, ensuring existing active widgets remain stable.
  • Optimized disk module performance by initializing PDH disk IO counters asynchronously.
  • Miscellaneous tweaks and stabilization for the widget Context Menu API.

Fixed

  • Fixed UI flickering during Widget::Refresh() by implementing nested batch updates (BeginUpdate / EndUpdate). UI redraws are now deferred until all nested element modifications are complete.
  • Fixed TextElement font face resetting during partial updates.
  • Fixed fontShadow property not applying correctly to UI elements.
  • Protected critical UI properties (containers, alignment, tooltips) from being overwritten during partial state updates.

[0.9.4.0-beta] - 2026-05-08

📅 8th May, 2026

Added

  • Added system.time API module.
  • Added ui.removeElementById(id) binding.
  • Added new CLI command for Manage window close request:
    • manage_novadesk.exe --request-close

Fixed

  • Fixed widget refresh lifecycle so stale ipcRenderer UI listeners are cleared before reloading .ui.js.
  • Improved .ndpkg installer admin-close behavior by adding elevated fallback.

[0.9.3.0-beta] - 2026-05-01

📅 1st May, 2026

Added

  • Added InputBox addon to the default plugin list in NWM (no longer requires separate packaging).
  • Added new JS bindings for widget window control and properties:
    • win.show() / win.hide()
    • win.setBounds() / win.getBounds()
    • win.setSize() / win.getSize()
    • win.setOpacity() / win.setBackgroundColor() / win.getBackgroundColor()
    • win.isFocused() / win.isVisible() / win.isDestroyed()
    • win.destroy() (destroys without firing close event)
  • Added new UI element methods:
    • ui.setElementProperty(id, key, value) - update a single property
    • ui.isElementExist(id) - check if an element exists
  • Added disk I/O metrics with PDH to the disk module:
    • disk.readSpeed() - returns read speed in bytes/sec
    • disk.writeSpeed() - returns write speed in bytes/sec
  • Added drag events for UI elements:
    • onDragStart - fired when drag begins
    • onDrag - fired continuously during drag
    • onDragEnd - fired when drag ends

Fixed

  • Fixed RoundLine element to use effective dimensions for positioning and drawing calculations.

[0.9.2.0-beta] - 2026-04-24

📅 24th April, 2026

Added

  • Added excludeItems support for widget packaging (nwm build).
  • Added additional widget events:
    • click
    • right-click
    • double-click
    • scroll-up
    • scroll-down
  • Added Ctrl-based runtime overrides for widgets.
  • Added system.recycleBin API:
    • openBin()
    • emptyBin()
    • emptyBinSilent()
    • getStats()
  • Added async Promise-based webFetch(...).
  • Added pixelHitTest property for UI elements.

Fixed

  • Fixed hit testing behavior for:
    • Rotator element
    • Histogram element
    • Area Graph element
  • Fixed UI font property handling.

Removed

  • Removed InputBox addon options:
    • message
    • placeholder

[0.9.1.0-beta] - 2026-04-21

📅 21st April, 2026

Added

  • Added Manage submenu and widget settings entries.
  • Added tray events:
    • double-click
    • scroll-up
    • scroll-down
  • Added widget toolbar options:
    • showInToolbar
    • toolbarIcon
    • toolbarTitle
  • Added widgetWindow methods:
    • win.minimize()
    • win.unMinimize()
  • Added widget .on(...) events:
    • minimize
    • unMinimize
  • Added global variable: __mainScriptDirPath.

Changed

  • Simplified TextElement hit testing.
  • Refactored tooltip handling to manual tracking for more stable hover/tooltip behavior.

[0.9.0.0-beta] - 2026-04-16

📅 16th April, 2026

Added

  • New InputBox add-on

  • Support for named CSS colors

  • New Image properties:

    • imageFlip
    • imageCrop
    • useExifOrientation
  • New Image element property:

    • scaleMargins
  • New elements:

    • Line
    • Button
    • Bitmap
    • Histogram
    • Rotator

Improved

  • Enhanced getAddonsPath function

[0.8.0.0-beta] - 2026-04-07

📅 7th April, 2026

Added

  • Introduced manage_novadesk GUI for managing widgets.
  • Added restart_novadesk.exe to restart the Novadesk application.
  • Added support for .ndpkg files for widget distribution.
  • Introduced a .ndpkg installer for widgets.
  • Added a new global variable: __addonsPath.
  • novadesk.exe now supports executing multiple scripts.
  • novadesk.exe now supports several CLI arguments.

Changed

  • Updated nwm for improved compatibility with .ndpkg files.
  • Modified the output structure of distributions generated by nwm.
  • nwm now generates .zip archives for widget distribution instead of raw files.

[0.7.0.0-beta] - 2026-03-24

📅 24th March, 2026

Added

  • Added support for meta.json.main in nwm run, allowing widgets to define a custom entry script path instead of always using index.js.

Changed

  • Updated engine IPC: main-to-UI messages now use Electron-style ipcRenderer.on(channel, (event, payload) => ...) instead of the old payload-first callback order.
  • Renamed clipString alias to textClip.

Fixed

  • Fixed TextElement hit testing to use the actual rendered text ink alpha instead of the layout box, preventing false hover detection above/below glyphs.
  • Fixed unstable button hover handling by preserving the currently hovered element, preventing repeated onMouseOver / onMouseLeave triggers.
  • Fixed an issue where setting a property on a text element would clear the text.

Removed

  • Removed appVolume, audioLevel, brightness, hotkey, and nowPlaying system objects (can now be replaced by external official addons).
  • Removed deprecated app.tray* methods, replaced with the new tray object from Novadesk.

[0.6.0.0-beta] - 2026-03-06

📅 6th March, 2026

Added

  • Integrated QuickJS for ECMAScript 2020 (ES11) support.
  • Added new modules: novadesk, system, and fs.

Changed

  • UI scripts now require the .ui.js suffix at the end of the script filename.
  • Renamed the win object to the ui object (alias updated accordingly).
  • Replaced the IPC method with a new implementation.

Removed

  • Removed include() and require() methods.
  • Removed all previous system and app objects.

[0.5.0.0-beta] - 2026-02-19

📅 19th February, 2026

Added

JSON API

  • Added fixture for comment preservation.
  • Booleans now persist as true/false instead of 1/0.
  • Suppresses merge-failure warnings for empty or whitespace-only files while keeping warnings for real merge failures.

App Object API

  • Added app.isPortable().
  • Added app.isFirstRun().

Engine & Module System

  • Implemented module-aware path resolution by propagating module directory context into exported function calls.

Element & Widget System

  • Added element grouping with dedicated group property.
  • Added win.removeElementsByGroup().
  • Added win.setElementPropertyByGroup().

Cursor System

  • Added CursorManager for element mouse cursors.
  • Added mouseEventCursor, mouseEventCursorName, and cursorsDir options.
  • Added support for built-in and custom .cur and .ani cursors.

System APIs

  • Added setWallpaper API to change desktop wallpaper.
  • Added brightness control API for Windows.
  • Added application volume control and mute APIs.

File & Icon APIs

  • Added file icon extraction.
  • Added ICO export functionality.

Global Variables

  • Added __widgetsDir
  • Added __offsetX
  • Added __offsetY
  • Added __offsetXPercent
  • Added __offsetYPercent
  • Added __clientX
  • Added __clientY
  • Added __screenX
  • Added __screenY

Widget Events

  • Added widget mouse events:
    • mouseDown
    • mouseUp
    • mouseMove
    • mouseOver
    • mouseLeave

Installer

  • Installer now includes Standard/Portable mode page, blocks Portable installs in system-protected paths, and skips uninstaller/registry/PATH changes when Portable is selected.

Fixed

Module System

  • Fixed js_require cache writeback so modules that replace module.exports are cached correctly.

Text Rendering

  • Fixed TextElement partial update state loss.
  • Preserved fontGradient and related text style fields in PreFillTextOptions.
  • Prevented gradient text from resetting to black on setElementProperties.

Widget Lifecycle

  • Fixed widget recreation crash.
  • Removed old widget from global widget list before deletion.
  • Prevented double-erase invalid iterator during WM_DESTROY.

Input & Interaction

  • Fixed mouse routing for non-interactive overlays.
  • Text or overlays no longer steal hover, click, cursor, wheel, or tooltip events from underlying interactive elements.

Engine & JS API

  • Fixed engine event callback context restoration to prevent win/Duktape stack corruption.

Installer Stub

  • Fixed installer stub uninstall cleanup now removes all child folders/files in install directory (including unknown generated system API caches) before final root deletion, with existing cmd fallback retained.

[0.4.0.0-beta] - 2026-02-11

📅 11th February, 2026

Added

Window & Lifecycle

  • Added new .on callbacks for widgetWindow focus and unfocus events.
  • Added new widgetWindow methods: setFocus() and unFocus().
  • Added new widgetWindow methods: getHandle(), getInternalPointer(), and getTitle().
  • Added support for gradient backgrounds in widgetWindow.

Elements

  • Added new element type roundLine.
  • Added new element type shapes with multiple shape variants.
  • Added gradient color support for elements.
  • Added automatic width and height calculation for bar element.
  • Added new element property show to control element visibility.

System & Runtime

  • Added new system monitor for audioLevel.
  • Added system to detect and verify portable environment support.
  • Added require method for loading modules.

Performance & Updates

  • Added win.startUpdate() and win.endUpdate() methods for batch updating element properties.

Installation

  • Added self-installation support for widgets using the new tool installer_stub.

Fixed

  • Fixed issue where images were not displayed when width or height was not explicitly set.

Removed

  • Removed deprecated element properties like solidColor2 and gradientAngle, replaced by the new gradient support system.

[0.3.0.0-beta] - 2026-02-05

📅 5th February, 2026

Added

  • Extended fontWeight support with string and numeric values.

    • String values: thin, extralight or ultralight, light, regular, medium, semibold or semi-bold, bold, extrabold or ultrabold, black
    • Numeric values: 100, 200, 300, 400, 500, 600, 700, 800, 900
  • Added fontPath property for loading custom fonts in the text element

  • Added inline style tag support for the text element

  • Added fontColor support for gradient colors

  • Added fontShadow support for text

  • Added letterSpacing property for the text element

  • Added case property for the text element

  • Added underline property for the text element

  • Added strikethrough property for the text element

Supported Inline Tags

  • <b> : Bold text
  • <i> : Italic text
  • <u> : Underlined text
  • <s> : Strikethrough text
  • <color=value> : Changes text color or applies a gradient
    Example: <color=#f00>Red Text</color>
    Example: <color=linearGradient(0,#f00,#0f0)>Gradient Text</color>
  • <size=value> : Changes font size in pixels
    Example: <size=24>Large Text</size>
  • <font=name> : Changes font face
    Example: <font=Consolas>Monospaced Text</font>
  • <case=value> : Changes text case
    Valid values:
    • normal : Maintains original casing
    • upper : Converts all text to uppercase
    • lower : Converts all text to lowercase
    • capitalize : Capitalizes the first letter of each word
    • sentence : Capitalizes the first letter of the first word
      Example: <case=upper>this will be uppercase</case>

[0.2.0.0-beta] - 2026-01-30

📅 30th January, 2026

Added

  • New JavaScript APIs on the app object: getAppDataPath(), getSettingsFilePath(), and getLogPath().
  • Dynamic product name retrieval from executable resources for consistent directory naming.

Fixed

  • Single Instance Enforcement: Resolved an issue where multiple instances could run if one was started as Administrator (by the installer) and another as a Standard User.
  • Changelog Sorting: Standardized versioning to 3-part Semver to ensure "Latest" version labeling works correctly.

Changed

  • Branding Consistency: Refactored GetAppTitle() to use PathUtils::GetProductName(), ensuring the product name is consistently pulled from executable resources across the entire application (including the tray menu).
  • Redirected settings.json, config.json, and logs.log to the user's %APPDATA% directory.
  • Updated the installer and uninstaller to handle user data cleanup in AppData.
  • Consolidated resource extraction logic across the codebase for improved performance (caching).

[0.1.0.0-beta] - 2026-01-30

📅 30th January, 2026

Added

  • Initial beta release...