-
-
Notifications
You must be signed in to change notification settings - Fork 42
Package Reference
Current as of: Ultrahand Overlay v2.4.1
This page covers everything needed to create and configure Ultrahand packages: folder layout, header fields, page/tab definitions, boot and exit hooks, language support, and the config.ini state file. For a complete list of available commands, see the Command Reference.
- Package Structure
- Package Headers
- Tab / Page Headers
- Command Headers
- Boot and Exit Hooks
- Special Root-Level Packages
- The config.ini State File
- Language Translations
- Complete Example
Packages live in /switch/.packages/<YOUR_PACKAGE_NAME>/ and are driven by a package.ini file.
/switch/.packages/
└── MyPackage/
├── package.ini ← required: commands and headers
├── config.ini ← auto-generated: runtime state
├── boot_package.ini ← optional: commands run on launch
├── exit_package.ini ← optional: commands run on close
└── lang/
├── en.json ← optional: English translations
└── ja.json ← optional: Japanese translations
A minimal package.ini looks like this:
;title='My Package'
;version=1.0.0
;creator=YourName
;about='A short description.'
[Section Header]
copy /path/to/source /path/to/dest
[*Dropdown Command]
;mode=option
list_source '(Option A, Option B, Option C)'Paths in commands are relative to the SD card root. Use ./ as a shortcut for the package's own folder (e.g. ./config.ini resolves to /switch/.packages/MyPackage/config.ini). You can also use .. to reference the directory above the package folder.
Package headers are ;key=value directives placed at the top of package.ini, before any [Section] headers. Values containing spaces should be wrapped in single quotes.
| Header | Description |
|---|---|
;title=<TEXT> |
The display name shown on the Packages menu. |
;display_title=<TEXT> |
An alternative title displayed inside the package (overrides ;title= for the in-package header). |
;version=<TEXT> |
The version string. Exposed via the {package_version} placeholder. |
;creator=<TEXT> |
The author name. |
;about=<TEXT> |
A short description of the package. |
;credits=<TEXT> |
Credits or acknowledgements. |
;color=<VALUE> |
Color for the package title. Accepts named colors (red, green, blue, yellow, orange, purple, pink, white) or a hex value (e.g. #a264fa). |
;show_widget=true/false |
When true, renders the system status widget alongside the package header. |
;show_version=true/false |
When true, displays the package version in the subtitle instead of the current section name. false by default. |
Example:
;title='Alchemist'
;display_title='Alchemist '
;creator=ppkantorski
;version=1.0.5
;about='Manage, convert, and install mods.'
;credits='Special thanks to contributors.'
;color=#a264fa
;show_widget=trueA package can define two navigable pages using empty sections prefixed with @. The first [@Name] becomes the left tab; the second becomes the right tab. Users switch between them with the D-Pad left/right buttons.
[@Enhance]
[*Patch Mods]
;mode=forwarder
package_source './include/patches.ini'
[@Integrate]
[*Install Mods]
;mode=forwarder
package_source './include/install.ini'Command headers are placed directly under a [Section Title] line, before any commands. They control how the list item is displayed and how it behaves.
| Header | Description |
|---|---|
;mode=<mode> |
Sets the command mode. |
;footer=<TEXT> |
Pre-defines a default footer label when no saved value exists in config.ini. |
;footer_highlight=true/false |
When true, draws the footer using the highlight color. |
;mini=true/false |
Renders the list item in reduced-height "mini" mode. |
;selection_mini=true/false |
Renders dropdown/option selection items in mini mode. |
;hold=true/false |
Requires the user to hold A for ~3 seconds before executing. Compatible with default, option, and slot modes. |
;progress=true/false |
Shows the in-progress throbber during toggle execution. |
;grouping=<VALUE> |
Controls how file_source results are grouped into section headers. See Grouping Modes. |
These headers control whether the list item is rendered at all. They can be combined.
| Header | Description |
|---|---|
;system=erista/mariko |
Restricts the item to a specific hardware revision. |
;state=handheld/docked |
Only renders the item in the specified console state. |
;hos_version=<CONDITION> |
Only renders when HorizonOS satisfies the condition (e.g. >=18.0.0). Supports >=, <=, >, <. |
;ams_version=<CONDITION> |
Only renders when Atmosphere satisfies the condition. Supports the same operators. |
These headers apply only to [Section Title] entries with ;mode=table.
| Header | Description |
|---|---|
;alignment=left/center/right |
Text alignment within the table. |
;background=true/false |
Draws the table background. |
;header_indent=true/false |
Draws a single header indent on the left side. |
;spacing=<INTEGER> |
Row spacing. |
;gap=<INTEGER> |
Gap after the table (alias for ;end_gap=). |
;start_gap=<INTEGER> |
Gap before the table. |
;end_gap=<INTEGER> |
Gap after the table. |
;offset=<INTEGER> |
Horizontal offset for table content. |
;scrollable=true/false |
Enables scrolling. Must be explicitly set to true to enable. |
;top_pivot=true/false |
Makes the top of the table selectable/focusable. |
;bottom_pivot=true/false |
Makes the bottom of the table selectable/focusable. |
;wrapping_mode=<none|char|word> |
Text wrapping mode for section text. |
;wrapping_indent=true/false |
Draws an indent on wrapped continuation lines. |
;polling=true/false |
When true, placeholder values update approximately once per second. |
;section_text_color=<COLOR> |
Color for section text. Accepts theme color names or hex values. |
;info_text_color=<COLOR> |
Color for info/value text. |
These headers apply to trackbar-mode entries.
| Header | Description |
|---|---|
;min_value=<INTEGER> |
Minimum value. |
;max_value=<INTEGER> |
Maximum value. |
;steps=<INTEGER> |
Number of discrete steps (for step_trackbar). |
;units=<STRING> |
Units label displayed alongside the value (e.g. %, MHz). |
;unlocked=true/false |
Marks the trackbar as unlocked for immediate interaction. |
;on_every_tick=true/false |
Executes commands on every tick rather than only on release. |
Place a boot_package.ini file inside your package folder. The [boot] section runs each time the package is opened (can be suppressed per-package by enabling Quick Launch in the package settings).
; /switch/.packages/MyPackage/boot_package.ini
[boot]
try:
path_exists ./initialized.flag
refreshPlace an exit_package.ini file inside your package folder. The [exit] section runs each time the package is closed.
; /switch/.packages/MyPackage/exit_package.ini
[exit]
set-ini-val ./config.ini State last_closed {timestamp(%Y-%m-%d)}Ultrahand recognizes two special packages at the root of /switch/.packages/:
| File | Behaviour |
|---|---|
/switch/.packages/boot_package.ini |
[on-boot] runs once on system startup. [boot] runs each time the Packages menu is opened, and again after overlay hiding. |
/switch/.packages/exit_package.ini |
[exit] runs each time Ultrahand is fully closed. |
Ultrahand automatically creates a config.ini file in your package's folder to persist runtime state — toggle on/off states, option footer selections, trackbar values, and custom footers set by set-footer. You do not need to create or manage this file manually.
You can read values from config.ini using the ini_file source function:
[Show Last Setting]
;mode=table
ini_file ./config.ini
'Current Mode'='{ini_file(MySection, mode)}'Packages can include their own language translation JSON files in a lang/ subfolder. Ultrahand loads the file matching the currently selected overlay language and applies it to all drawn strings. Keys are the original text; values are the translated strings.
/switch/.packages/MyPackage/lang/
├── en.json
├── ja.json
└── zh-hans.json
{
"Enable Feature": "機能を有効にする",
"Reboot Now": "今すぐ再起動"
}This mirrors the language system used by libultrahand overlays.
The following demonstrates a complete, well-structured package:
;title='Example Package'
;display_title='Example '
;version=1.2.0
;creator=YourName
;about='Demonstrates common Ultrahand package patterns.'
;color=#a264fa
;show_widget=true
[@Main]
; === System Info Table (live-polling) ===
[System Info]
;mode=table
;alignment=left
;polling=true
'Atmosphere'='{ams_version}'
'HorizonOS'='{hos_version}'
'IP Address'='{local_ip}'
; === Download and Install (hold-to-confirm) ===
[Install Update]
;hold=true
try:
download https://example.com/mod.zip ./downloads/
unzip ./downloads/mod.zip /
delete ./downloads/mod.zip
notify-now 'Update installed! Reboot to apply.'
try:
!path_exists ./downloads/mod.zip
set-footer Installed ✓
[@Controls]
; === Volume Slider ===
[Volume]
;mode=trackbar
;min_value=0
;max_value=150
;units=%
;on_every_tick=true
volume {value}
; === Auto Brightness Toggle ===
[Auto Brightness]
;mode=toggle?off
on:
backlight auto on
off:
backlight auto off
; === Reboot Options Dropdown ===
[*Reboot To]
;mode=option
list_source '(System, Hekate, UMS)'
try:
path_exists /bootloader/hekate_ipl.ini
reboot {list_source(0)}
notify Rebooting...
; === Named Step Trackbar ===
[Performance Mode]
;mode=named_step_trackbar
list_source '(Eco, Normal, Boost, Turbo)'For more examples, visit the examples/ directory or browse Ultrahand Packages.
Notice: Documentation is currently a work-in-progress. For clean examples, look at some of the more well-crafted Ultrahand Packages out there for guidance.

