Releases: ppkantorski/Ultrahand-Overlay
Releases · ppkantorski/Ultrahand-Overlay
Release list
Ultrahand Overlay 2.5.3
List of Changes
- Proper return context has been established for
opencommands in packages.- Clicking back from an overlay opened via
opencommand now takes you to exactly where you left off in the package. - With this change, overlays can now be crafted to be proper extensions / plugins for packages themselves to leverage.
- Clicking back from an overlay opened via
- Add
field=valueJSON array lookup (by @Niklas080208 in #326).- In place of indexes for arrays in JSON data entries, users can now specify a matching
field = valuecontained in the corresponding array instead.
- In place of indexes for arrays in JSON data entries, users can now specify a matching
- Improved touch handling (from latest
libultrahand). - Various code and library optimizations.
- Over 160 KB smaller than
v2.5.2(now the smallest version sincev1.1.6).
- Over 160 KB smaller than
libnxand other development libraries have been updated.- Now using
libnx 4.12.0-1.
- Now using
Now bundled withnx-ovlloader v2.0.3.- Important:
nx-ovlloader v2.0.3is vastly fine from testing and reports from a wide variety of users, but one is reporting an issue that will take more time to investigate properly. For the time being, we will be sticking withnx-ovlloader v2.0.2. - 07/18/2026 2:54 AM PST
- Important:
- Various bug fixes and corrections.
Full Changelog: d706cd8...v2.5.3
Ultrahand Overlay 2.5.2
List of Changes
- New
;text_color=and;footer_color=command headers for command list items.;text_color=<HEX>and;footer_color=<HEX>(rgb888, e.g.#RRGGBBorRRGGBB) set a custom title/value color for that specific item.- Applies to standard list items, toggles, and dropdown-selection items; takes priority over theme defaults but never overrides transient run-state colors (spinner/checkmark/crossmark/in-progress).
- New
;bg_color=and;border=table command headers.;bg_color=<HEX>sets a custom table background color. Only the RGB channels are used (alpha is still read from the theme).;border=true/;border=falsetoggles the table's border on or off independent ofDynamic Tables.
- New
matching_hex_val_custom <FILE_PATH> <ASCII_PATTERN> <OFFSET> <HEX_VALUE>conditional command (and inverse!matching_hex_val_custom).- Resolves
<OFFSET>relative to the file offset of<ASCII_PATTERN>(e.g."CUST"), using the same magic-scan + offset cache that hex-by-custom-offset writes use. - Usable standalone or with
;visibility_condition=/;toggle_state_condition=, same as the othermatching_*checks.
- Resolves
- New In-Package Titles toggle in Widget Settings (
in_package_titles, on by default).- Separate from the existing Package Titles toggle. When off, every in-package (sub-menu) title is forced to the theme's default package title color, overriding any color a package requested via its own header (e.g.
;color=).
- Separate from the existing Package Titles toggle. When off, every in-package (sub-menu) title is forced to the theme's default package title color, overriding any color a package requested via its own header (e.g.
- Input handling changes to prevent accidental hides while a command is running.
Xnow hides the overlay while a command is running (moved offB), so reflexively pressingBto "go back" no longer hides the overlay mid-command.Bis swallowed during a running command instead of hiding or popping the menu.- D-pad and
Anow visibly bounce the highlighted item while a command is running, instead of incorrectly triggering a click animation.
- Settings menu navigation bug fixes.
- Fixed overlay/package list titles and versions not switching to the theme's Selection Text/Value color when highlighted.
- These now use the new base-color path internally, so highlighting behaves correctly again while still supporting the new
;text_color=/;footer_color=per-item overrides.
- These now use the new base-color path internally, so highlighting behaves correctly again while still supporting the new
- Slight changes to the default theme colors and settings.
Dynamic Logonow defaults to off instead of on.- Side-note: For color changes to be applied, users must re-apply their default theme, or install Ultrahand fresh.
- Refreshed default theme colors (click, dynamic logo, main logo, and table background), and added a new bundled
classic.initheme.classic.inipreserves the exact pre-2.5.2 default color palette for anyone who prefers the previous look.
- Improved download reliability for usage with a wider range of url domains.
- Foreground related bug fixes in
libultrahand. - Fixed a mismatched declared size on the default key-combos array.
Full Changelog: v2.5.1...v2.5.2
Quick Update
- Foreground request related bug fixes. - 07/10/2026 02:54 AM PST
- Slight tweaks to default theme. - 07/10/2026 4:20 AM PST
- New table wrapping mode
auto+ bug fixes for notification translations / alignments. - 07/10/2026 7:35 AM PSTautoutilizes character wrapping for Asian languages and word wrapping for non-Asian languages.
- New Ultrahand config.ini key
swipe_offset(integer value; optional) for calibrating the swipe to open behavior's X-start. - 07/10/2026 7:35 AM PST - Hard line break fix for table
wrapText(proper handling of newlines). - 07/10/2026 08:04 AM PST - Add translation handling in CategoryHeader constructors. -07/10/2026 8:33 AM PST
- Translations now apply to sections on divider split strings, new
{ovl_language}placeholder for overlay language, bug fix for hard line break changes. - 07/10/2026 10:01 AM PST{ovl_language}returns values likeen,es, etc based upon the selected language in the Ultrahand settings menu.
Full Changelog: v2.5.2...d706cd8
Ultrahand Overlay 2.5.1
Stability Update
List of Changes
- Ultrahand package bug fix for placeholder resolution within sourced commands.
- This bug appears to have been introduced in v2.4.5.
- No changes to
libultrahand v2.5.0.
Full Changelog: v2.5.0...v2.5.1
Ultrahand Overlay 2.5.0
List of Changes
- New
Switch 2 Styletoggle inTheme Settings(Misc), on by default.- When enabled, selected list items, the cursor, trackbar handles are replaced with a more rounded, slightly wider cursor utilizing the new color-wheel effect.
- Toggles render as a sliding Switch-style pill switch instead of a plain ON/OFF glyph.
- Single-choice selection lists draw a circular radio mark in the value slot instead of a checkmark.
- Turning the toggle off preserves the classic
Switch 1look from before v2.5.0. - Side-note: requires
libultrahand v2.5.0or greater; compiled overlays built against olderlibultrahandversions are unaffected.
- Radio-style selection lists.
Themes,Wallpapers,Sounds,Language,Launch Combos,Priority, and package;mode=optiondropdown menus now use the new circular radio mark in place of a checkmark whenSwitch 2 Styleis on.
- New theme INI color keys added.
- Cursor
s2_highlight_color_1: first fixed accent in the default rotating highlight wheel (cursor/selection border).s2_highlight_color_2: second fixed accent in the default rotating highlight wheel.s2_highlight_color_3: bright hero color in the default wheel.s2_highlight_color_3_deep: deep/shadow variant ofs2_highlight_color_3.s2_highlight_color_4: second bright hero color in the default wheel.s2_highlight_color_4_deep: deep/shadow variant ofs2_highlight_color_4.s2_alt_highlight_color_1: first fixed accent in the alternate wheel (shown while locked or mid-click).s2_alt_highlight_color_2: second fixed accent in the alternate wheel.s2_alt_highlight_color_3: bright hero color in the alternate wheel.s2_alt_highlight_color_3_deep: deep/shadow variant ofs2_alt_highlight_color_3.s2_alt_highlight_color_4: second bright hero color in the alternate wheel.s2_alt_highlight_color_4_deep: deep/shadow variant ofs2_alt_highlight_color_4.
- Table Border
s2_table_border_color_1: first fixed accent in the rotating table-border wheel.s2_table_border_color_2: second fixed accent in the rotating table-border wheel.s2_table_border_color_3: bright hero color in the table-border wheel.s2_table_border_color_3_deep: deep/shadow variant ofs2_table_border_color_3.s2_table_border_color_4: second bright hero color in the table-border wheel.s2_table_border_color_4_deep: deep/shadow variant ofs2_table_border_color_4.table_border_color: base color of the new table border, used whenDynamic Tablesis off.
- Widget Border
s2_widget_border_color_1: first fixed accent in the rotating widget-border wheel.s2_widget_border_color_2: second fixed accent in the rotating widget-border wheel.s2_widget_border_color_3: bright hero color in the widget-border wheel.s2_widget_border_color_3_deep: deep/shadow variant ofs2_widget_border_color_3.s2_widget_border_color_4: second bright hero color in the widget-border wheel.s2_widget_border_color_4_deep: deep/shadow variant ofs2_widget_border_color_4.
- Switch 2 UI Elements
s2_radio_ring_color: outer ring of an unselected radio mark.s2_radio_selected_color: fill color once a radio choice is confirmed.s2_radio_inprogress_color: fill color while a radio choice is mid-selection.s2_radio_inner_color: small inner dot drawn inside a filled radio mark.s2_toggle_on_color: toggle track color when the toggle is on.s2_toggle_off_color: toggle track color when the toggle is off.s2_toggle_circle_color: color of the toggle's sliding knob.
- Preliminary updates for the bundled
ultra.iniandultra-blue.inithemes. - Side-note: custom themes that don't define these keys fall back to libultrahand's built-in defaults.
- Cursor
- Widget Settings tweaks.
Dynamic Colorshas been renamed toDynamic Temps.- New
Dynamic Bordertoggle (animates the widget's border color according to the theme colors).
- Theme Settings: new
Dynamic Tablestoggle (default on).- Drives the new border effect drawn around package table sections; independent of the
Switch 2 Styletoggle. - When off, tables resort back to the
table_border_colortheme ini preset.
- Drives the new border effect drawn around package table sections; independent of the
- Bug fix for nested placeholders.
- Placeholder resolution is now depth-aware.
- A placeholder whose inner content hasn't resolved yet is now left intact for a later pass instead of producing a premature
null.
- Settings menu navigation bug fix.
- Added a recovery guard that re-derives the settings menu/sub-menu state if both navigation flags are unexpectedly cleared (e.g. after a rapid back-press chain or an interrupted hide/show transition), preventing the menu from getting stuck.
- Fixed a stale sub-menu flag for combo-mode entries that could cause a double-pop on the next B press.
- Various alignment corrections.
Full Changelog: 9b965b1...v2.5.0
Ultrahand Overlay 2.4.5
List of Changes
- New conditional
{if_...}placeholder method.null{if_null(<VALUE>,<TRUE_FALLBACK>,[FALSE_FALLBACK])}returnsTRUE_FALLBACKwhenVALUEresolved tonull(the literal returned by an unresolved/missing placeholder).
!null{if_!null(<VALUE>,<TRUE_FALLBACK>,[FALSE_FALLBACK])}is the inverse.
==,!={if_==(<VALUE>,<COMPARE_VALUE>,<TRUE_FALLBACK>,[FALSE_FALLBACK])}and{if_!=(...)}do exact string equality.
>,<,>=,<={if_>(<VALUE>,<COMPARE_VALUE>,<TRUE_FALLBACK>,[FALSE_FALLBACK])},{if_<(...)},{if_>=(...)}, and{if_<=(...)}compare numerically when both values are numbers (compared as floats), and fall back to a plain lexicographic (case-sensitive) comparison otherwise.
version_>,version_<,version_>=,version_<={if_version_>(<VALUE>,<COMPARE_VALUE>,<TRUE_FALLBACK>,[FALSE_FALLBACK])},{if_version_<(...)},{if_version_>=(...)}, and{if_version_<=(...)}do version-aware comparison.- Numeric segments compare as integers (
1.10.0>1.9.0). -suffix is treated as a pre-release and sorts lower (2.0.1-rc<2.0.1).+suffix is treated as build metadata and sorts higher (2.0.1+r23>2.0.1).
- The
FALSE_FALLBACKis optional in every form. When omitted, the false branch returnsVALUEunchanged.
- New
{crc32(<FILE_PATH>)}placeholder method.- Returns the CRC32 of a file as 8 uppercase hex characters, or
nullif the file can't be read. - Useful with the
{if_...}andmatching_*checks for verifying file contents.
- Returns the CRC32 of a file as 8 uppercase hex characters, or
- All placeholders can now be composed to define any source declaration.
- All placeholder variable declarations are fully resolved in order before being used.
- All placeholder commands (excluding
_source) can be nested and chained to build the final_sourcedeclaration.- Side-note: No commands are executed at this stage; only placeholder expressions are evaluated.
- Non-source variable placeholders can now be redefined mid-section in sourced commands.
- New standalone conditional commands for use in packages.
path_exists <PATH>ipc_exists <SERVICE_NAME>module_exists <TID>(true when the module's content folder exists, running or not)module_is_active <TID>(true only when the module is currently running)matching_txt_line <FILE_PATH> <TEXT_LINE>matching_hex_val <FILE_PATH> <OFFSET> <HEX_VALUE>matching_ini_val <FILE_PATH> <SECTION> <KEY> <VALUE>- Each runs as its own command and resolves to success or failure, so it can be used mid-script to force a command failure or success (handy with
try:logic). - Prefix any of them with
!to invert the result (!path_exists,!module_exists, etc.).
- New
;visibility_condition=option directive for usage with all command objects.;visibility_condition=<MODE> <ARGS>draws a menu item or section only when the condition is satisfied; otherwise the item is skipped at render time.- Accepts any of the conditional modes above (
path_exists,ipc_exists,module_exists,module_is_active,matching_txt_line,matching_hex_val,matching_ini_val) with!negation, and resolves placeholders inside the condition. - An empty condition (as well as a successful condition) shows the item; an unknown mode, missing argument (or false condition) hides it.
- Revised integration from PR #309.
- New
;toggle_state_condition=option directive.- Sets a toggle's initial ON/OFF state from a live condition instead of an on/off path check. Uses the same conditional modes as
;visibility_condition=. A satisfied condition starts the toggle ON. - Revised integration from PR #309.
- Sets a toggle's initial ON/OFF state from a live condition instead of an on/off path check. Uses the same conditional modes as
- New
;hold=truedirective for hold-to-activate items.- Add
;hold=trueto a command list item or a toggle to require the user to hold the action before it fires. - While held, the item shows the in-progress symbol; execution is deferred until the hold completes, and the action can be cancelled by releasing early.
- The hold length is set globally by the new Hold Duration trackbar (see below).
- The built-in default Reboot/Shutdown package now ships its
Shutdownentry with;hold=true.
- Add
- New
modulecommand for starting and stopping sysmodules.module start <TID>launches a sysmodule by program ID.module stop <TID>stops a sysmodule, graceful-first with a force-kill fallback for dynamic modules.- Reads the module's
toolbox.jsonfor its shutdown contract; static modules with no graceful contract are refused rather than risking an unsafe kill. <TID>accepts a bare 16-hex-character folder name or a0x-prefixed program ID.
- New
ipc-exec <SERVICE_NAME> <ENUM_CMD>command.- Sends a void to void IPC command to a service; success means the dispatch was accepted.
- New
ntp-sync <NTP_URL>command.- On-demand clock sync to the NTP host you specify.
- Checks for internet access internally before attempting the sync.
- New
refresh-returncommand for sourced commands (dropdown menus).- When returning from a sourced selection,
refresh-returnredraws the entire prior menu and lands the cursor back on the item you came from, instead of a plain back. - Calling is optional. Without is faster, so only use
refresh-returnwhen the prior menu needs to be rebuilt to reflect changes (e.g. values that conditions key off of).
- When returning from a sourced selection,
- New
refresh comboscommand argument.refresh combosreloads the launch key combos live, so changes take effect without restarting the overlay. This joins the existingrefresh theme,refresh package, andrefresh wallpaperarguments.
- New Input Settings section added to Misc.
- Houses Launch Combos, Swipe to Open, Haptic Feedback, and the two new input options below.
- New Stick Navigation toggle. When on, the analog stick navigates menus alongside the D-pad; when off, only the D-pad navigates. Applies to all
libultrahand v2.4.5+overlays. - New Hold Duration track-bar. Sets the global command hold-A length for all hold-to-activate actions, from
0.5sto5.0s(default3.0s).
- Settings menu reorganized and renamed.
- Page Recall and Launch Recall toggles have been removed. These behaviors are now always on.
- The old Features header is now Feature Settings.
- Auto NTP Sync is renamed NTP Sync Downloads.
- The handheld / docked
;state=directive renamed to;device_state=.- IMPORTANT: Packages that used
;state=must update to;device_state=.
- IMPORTANT: Packages that used
ini_file_sourcenow supports wildcard paths.- A wildcard
ini_file_sourcepath enumerates every matching.iniand merges their section names (empty names skipped, duplicates removed, first occurrence wins). - Multiple
ini_file_sourcelines now accumulate sections together rather than each one replacing the last. - Revised integration from PR #312.
- A wildcard
- The default root package now includes an
INI Entryfor/bootloader/ini/*.inientries inReboot To.- Side-note: Users may want to delete
/switch/.packages/package.inito have this command updated. - Revised integration from PR #312.
- Side-note: Users may want to delete
mirror-is now accepted as an alias formirror_(mirror-copy,mirror-cp).- Side-note: This follows the loose convention where
-are used with action commands (set-ini-val,sync-ntp, etc) and_are used to for check commands that simply resolve to success or failure (path_exists,matching_ini_val, etc).
- Side-note: This follows the loose convention where
- The overlay version placeholder
{ovl_version(<OVL_PATH>)}now works with relative path resolution (i.e../and./../). - Cleaner dock power-down protocol on
rebootandshutdowncommands.- A USB-PD teardown is now staged before any shutdown so the console signals the dock to cut its 5V rail before the PMIC powers off.
- Bug fix from Issue #313.
- New
Overlay does not exist!notification for attempting to launch an overlay file that does not exist.- Launching a mode whose overlay file is missing now reports the missing overlay directly instead of misreporting it as AMS-incompatible.
New Contributors
- @Niklas080208 made their first contribution in #312
- @rashevskyv made their first contribution in #309
Full Changelog: v2.4.4...v2.4.5
Quick Update
;device_state=processing bug fix. - 06/11/2026 8:00 AM PST- Variable placeholder definition / redefinition and resolutions bug fix. - 06/11/2026 8:00 AM PST
Full Changelog: v2.4.5...9b965b1
Ultrahand Overlay 2.4.4
Stability Update
List of Changes
- Quick bug fix for the
exit packagecommand.- In the prior version triggering
exit packagewas preventing the package header from being properly cached for forwarder packages until Ultrahand exits.- This broke things like package versions, titles, and info sections in package forwarders from being properly cached after triggering (now resolved).
- In the prior version triggering
- Side-note: Compiled with
libultrahand v2.4.3(v2.4.4will be skipped on this release; no changes).
Full Changelog: v2.4.3...v2.4.4
Ultrahand Overlay 2.4.3
List of Changes
- Sleep halting of the background event poller in
libultrahand(to prevent all polling activity during shallow sleep).- This makes the CPU load contribution from the overlay 0% during shallow sleep.
Full Changelog: v2.4.2...v2.4.3
Ultrahand Overlay 2.4.2
List of Changes
- New package command option header
;ram_size_gb=for conditionally drawing commands based on detected system RAM.;ram_size_gb=4will only apply on 4GB systems,;ram_size_gb=8on 8GB systems.- RAM size is detected at fuse data write time and cached.
- Older fuse files without this key are updated automatically on next startup.
- New package placeholders:
{ram_size_gb},{hekate_version},{ovlloader_version},{ultrahand_version}, and{ovl_version(<PATH_TO_OVL>)}.{ram_size_gb}: returns4or8based on detected system RAM (read from fuse data).{hekate_version}: reads fromsdmc:/bootloader/update.binand is cached at startup.{ovlloader_version}: reads from the running loader info and is cached at startup.{ultrahand_version}: returns the currently running Ultrahand version.{ovl_version(<PATH_TO_OVL>)}: dynamically reads the version of any overlay by path.
- Expanded
exitcommand with new destination arguments.exit packageinstantly returns to the packages menu from anywhere in the package nav stack (including nested menus and script overlays) with the cursor positioned on the originating package.exit overlaysandexit packageshave been renamed toexit to_overlaysandexit to_packages.exit ovlloadertriggers a complete exit ofnx-ovlloader.
- Expanded
rebootcommandreboot ovlloadercommand using the same reload flag mechanism asexit ovlloader.- Triggers an nx-ovlloader reload on demand without requiring a heap size change.
nx-ovlloaderversion is now compared before and after a Software Update.- If a version change is detected, Ultrahand automatically triggers a reload so the new loader takes effect immediately without a manual reboot.
- New
force_failurecommand.- Explicitly marks command execution as failed (useful for
try:logic in packages).
- Explicitly marks command execution as failed (useful for
- Scope fix for
execcommands.executeIniCommandsnow correctly derives the package path from the ini file's actual location rather than always defaulting to the calling package's path.
- Bug fix for
;mode=optiondrop-down losing the option symbol on back when no value has been set.- Footer now correctly restores to
OPTION_SYMBOLas the default rather than an empty/null string.
- Footer now correctly restores to
- Name split footer normalization fix for option-mode checkmark matching.
- Footers written by
boot_package(e.g."0 - (default)") now correctly restored inSelectionOverlayafter subsequent value changes.
- Footers written by
- Table fixes / improvements.
- Lines beginning with
;are now skipped (comment-out support for table rows). - Rows where a placeholder resolves to
""now correctly shift columns instead of rendering a blank first column (bug fix). - The section and info columns now wrap independently to their own available widths, with rows aligned pairwise so multi-line entries in either column don't go out of sync.
- Creator field text wrapping mode corrected from
"none"to word wrapping.
- Lines beginning with
- Bug fix for
PROTECTED_FILES(atmosphere/package3,atmosphere/stratosphere.romfs) not being correctly staged to.ultraduringcopy,move, andunzipoperations.- These changes fix updating AMS from Ultrahand via reboot payload in more test cases.
- IDDQ fuse calibration values now correctly scaled on write (
cpu_iddqx4,soc_iddqx4,gpu_iddqx5) to matchhekate. - Scroll bar object rendering corrections in
libultrahand. atmosphere.rgbawallpaper is now bundled insdout.zip.- New master volume IPS patch included (
d1e98d469...ips) for latest HOS support. - Now packaged with nx-ovlloader v2.0.2.
Full Changelog: 59b531c...v2.4.2
Ultrahand Overlay 2.4.1
List of Changes
- Widget now has an optional border (on by default).
- New theme color
widget_border_color. - New toggle for
BorderinSettings > Widget. - Themes
ultra.iniandultra_blue.inihave been updated.
- New theme color
- Improved audio event handling (for simultaneous sound effect playbacks) in
libultrahand. - Improved combo input isolation and button event handling.
- Home event system tick flag storing in
libultrahand(for devs only). - Slight alignment corrections.
Full Changelog: v2.4.0...v2.4.1
Quick Update
- Slight widget alignment correction for the 100% battery case. - 04/20/2026 5:02 AM PST
hide_widget_bordervariable loading bug fix inlibultrahand. -04/20/2026 7:45 AM PST
Full Changelog: v2.4.1...59b531c
Ultrahand Overlay 2.4.0
List of Changes
- Across the board performance optimizations to rendering methods in
libultrahand.- Significantly improved wallpaper rendering performance (60FPS on 612 MHz cpu under-clock).
- Across the board optimizations to all
libultrafunctions inlibultrahand.- Now compiling back to pre-
Ultrahand Overlay v1.1.7sizes. 😎
- Now compiling back to pre-
- Overlay memory mode features have been expanded.
- 6MB overlay heap now supports wallpapers and higher buffer sizes (faster copy, downloads, unzip, etc).
- 4MB overlay heap now supports sound effects and slightly higher buffer sizes.
- Improved table drawing (significantly better performance + various bug fixes).
- Download commands now perform a NTP sync to
pool.ntp.orgone time after initial startup when called.- This feature will auto-fix issues with SSL handshakes breaking due to time de-synchronization.
- New
Auto NTP Synctoggle in theSettings > Miscellaneousmenu for disabling this feature.
- New
Page RecallandLaunch Recalltoggles inSettings > Miscellaneous.Page Recallpreserves memory of what item you were on on page left / right for proper recall back to that item (on by default).Launch Recalltakes you back to the exact overlay / package you used a launch combo to enter on the main menu when you click such combo again (on by default).- When turned off, combo returns simply return to Ultrahand cold (like before).
- Side-note: This function only works with overlays compiled with >=
libultrahand v2.4.0.
- Max overlay / package sort priority has been increased from 20 to 25.
- Critical bug fixes for page swapping / swapTo in
libultrahand.- There was an issue where rapid tapping of page left / right could trigger a broken GUI pointer (crash).
- This issue is now resolved.
- There was an issue where rapid tapping of page left / right could trigger a broken GUI pointer (crash).
- Improvements to feedback (sound + haptics).
- Both sound and haptics now use their own threads for improved reliability with event synchronization for improved performance.
- Numerous additional tweaks and unmentioned bug fixes.
Full Changelog: 7df15c9...v2.4.0