Homebrew Menu - Nintendo Switch Brew (2024)

Table of Contents
Contents Touch controls References

The Homebrew Menu (hbmenu) is the menu for launching homebrew applications. Applications are launched using the Homebrew ABI, hence normally nx-hbloader will do the actual launching.

Contents

  • 1 Usage
  • 2 Controls
    • 2.1 Touch controls
  • 3 Status
  • 4 Netloader
  • 5 Themes
  • 6 File Associations

See Homebrew Applications for SD layout etc.

Use the D-Pad/joystick to select the app/directory, up/down/ZL/ZR can be used for faster scrolling. Press A to launch the app. Navigating directories is supported, press A to enter a directory and press B to leave the current directory. Press Y to activate netloader and press B to deactivate netloader.

Press the - button to enter Theme Menu. Press X to (un)star the current menu entry.

Touch controls

To navigate through the list of folders and applications you can swipe left and right on the bottom list. To open an item you can tap on it in the list or with it highlighted tap the Open or Launch button prompt in the bottom right. To go back (a folder) you can swipe up or tap the Back button prompt in the bottom right (the latter is only available when no message-box is shown / netloader isn't active). To activate the netloader you can swipe down on the screen. To enter Theme Menu you can swipe left on the screen.

To (un)star the current menu entry you can touch the (un)star button prompt.

The battery/charge/temperature status can be displayed, however this is only displayed when the required services are available/accessible.

The local-time and network status are also displayed.

With netloader activated as described above you can load apps over the network with nxlink. With the toolchain setup run nxlink <nrofile> if your network can handle UDP broadcast messages. If nxlink fails with "No response from Switch!" you can use -a <ip address> before <nrofile> for the address to send the app to. See nxlink help for more options.

Themes can be optionally loaded from SD "/config/nx-hbmenu/themes/". The theme (or the default) can be selected using the Theme Menu via the - button. This uses libconfig. Default settings will be used for any settings not specified in the theme (including themeInfo).

The file extension is .cfg. .romfs is also supported, this is RomFs. With the toolchain setup you can run the following to build a .romfs: build_romfs {input directory} {out name}.romfs. The .romfs (and therefore the input directory) contains: '/theme.cfg', optionally '/icon.jpg' for the menu-entry in Theme Menu, and any assets.

Directories or .zip can also be used for themes, which have the same content described above for RomFs. .zip must directly contain the theme data, no directories.

See Homebrew Themes for a list of themes.

The string used for displaying the buttons/stars can be set with buttonAText, buttonBText, buttonXText, buttonYText, buttonMText, labelStarOnText, and labelStarOffText, but normally these can be left at the defaults. Change the value of the enableWaveBlending field to 1 to enable wave blending.

There's also borderColor, borderTextColor, and progressBarColor fields which can be set like the other color fields. logoColor can be used to set the RGB color of the logo, the alpha component is loaded from the logo image. highlightGradientEdgeColor is also available.

The color fields are RGBA.

Sample theme file:

themeInfo={ name="Theme Name"; author="Theme Author Name"; version="1.0.0";};lightTheme={ textColor=(0,0,0,255); frontWaveColor=(255,102,204,255); middleWaveColor=(255,51,153,255); backWaveColor=(204,0,153,255); backgroundColor=(233,236,241,255); highlightColor=(255,77,166,255); separatorColor=(128,0,128,255); enableWaveBlending=0;};darkTheme={ textColor=(255,255,255,255); frontWaveColor=(255,51,153,255); middleWaveColor=(255,102,204,255); backWaveColor=(204,0,153,255); backgroundColor=(0,0,0,255); highlightColor=(255,77,166,255); separatorColor=(255,255,255,255); enableWaveBlending=0;};layout={ <object name>={ visible=true; posType=true; posStart = (100,400); posEnd = (170,0); size = (0,680); }; // Any other objects here. };assets={ <object name>={ path = "relative_path_in_romfs"; imageSize = (256,256); }; // Any other objects here.};

The 'layout' group is optional. Each group within this is for a layout object, these and the settings contained within the objects are all optional (defaults are used when not specified). How each setting in the layout objects' are handled are specific to each object. The 'visible' field controls whether the object is displayed, however this is ignored from config for some objects / unused for certain other objects. posType controls the handling for pos* fields: generally this does nothing, however with some objects this controls whether the pos is absolute (false) / relative to {base-pos} or special-handling (true). When posType is absolute the pos* fields must not be negative. The content of 'size' must not be negative.

Note that increasing *Wave height compared to the defaults can result in slowdown since sw-rendering is used.

Layout objects:

Layout object nameDescription'visible' from config ignored / field usedUsed fields (besides 'visible')
logoHbmenu logo image.Yes, yesposStart
hbmenuVersionHbmenu version text.Yes, yesposStart
loaderInfoLoader info text (displayed next to hbmenuVersion with the defaults).

When the loader-info string doesn't contain a space, posStart is used directly for the text position, otherwise the right-justified position from posEnd is used.

Yes, yesposStart, posEnd
attentionTextAttention text (Applet Mode text). When posType is relative (the default), the base position is the final position used by 'status'.Yes, yesposType, posStart
logInfoLogging info for debug enabled via a build define.Yes, yesposStart
infoMsgText for NoAppsFound_Msg.Yes, yesposStart
menuPathMenu path text.No, yesposStart, size[0]
menuTypeMsgText for the current type of menu (such as "Theme Menu"). Position is right-justified from posStart.No, yesposStart
msgBoxSeparatorMessage-box separator. Position is relative to the bottom of the box.No, noposStart[1]
msgBoxBottomTextMessage-box text displayed at the bottom below the separator. Position is relative to the bottom of the box.No, noposStart[1]
backgroundImageBackground image, not set with the defaults. Requires assets.background_image to be setup. This is drawn after backgroundColor, the maximum drawn y-pos is the same as backgroundColor (drawing where the waves are located is skipped). Note that this can result in slowdown since sw-rendering is used, especially with an image which covers the entire screen (besides where the waves are displayed).No, yesposStart
backWaveBack wave. The height is controlled by size[1], relative to the bottom of the screen.No, yessize[1]
middleWaveMiddle wave. The height is controlled by size[1], relative to the bottom of the screen.No, yessize[1]
frontWaveFront wave. The height is controlled by size[1], relative to the bottom of the screen.No, yessize[1]
buttonAButton A, displayed with the string from theme*.buttonAText. With posType=relative (default is absolute) the position is relative to buttonAText.No, yesposType, posStart
buttonATextButton A text. posType=true is the same as absolute since the base-pos is 0.No, yesposType, posStart
buttonBButton B, displayed with the string from theme*.buttonBText. With posType=relative the base position is buttonBText.No, yesposType, posStart
buttonBTextButton B text. With posType=relative the base position is buttonA. When buttonA is displayed with non-empty-directory, posStart is used, otherwise posEnd is used (buttonA not displayed).No, yesposType, posStart
buttonYButton Y, displayed with the string from theme*.buttonYText. With posType=relative the base position is buttonYText.No, yesposType, posStart
buttonYTextButton Y text. With posType=relative the base position is buttonB, or if that's not displayed (menu path is in the root directory) the base is buttonA instead.No, yesposType, posStart
buttonMButton '-', displayed with the string from theme*.buttonMText. With posType=relative the base position is buttonMText.No, yesposType, posStart
buttonMTextButton '-' text. With posType=relative the base position is buttonY.No, yesposType, posStart
buttonXButton X, displayed with the string from theme*.buttonXText. With posType=relative the base position is buttonXText.No, yesposType, posStart
buttonXTextButton X text. With posType=relative the base position is buttonM.No, yesposType, posStart
networkIconNetwork status icon. With posType=relative the final position from 'status' is used for the base X-coordinate, however posStart[1] is used directly as the Y-coordinate regardless.No, yesposType, posStart
batteryChargeBattery charge text. The position from posStart is right-justified.No, yesposStart
batteryIconBattery icon.No, yesposStart
chargingIconBattery charging icon.No, yesposStart
statusText displayed for the time. The position from posStart is right-justified.No, yesposStart
temperatureTemperature text.No, yesposStart
menuListMenu list. posStart is the absolute position for the first tile. posEnd is the relative position for the next tile, relative to the current tile (outline not included). The size doesn't include the outline.No, noposStart, posEnd, size
menuListTilesposEnd[0] is the the maximum number of tile entries to adjust the currently selected entry index by, for example with HID input for DPad Up/Down.No, noposEnd[0]
menuListIconMenu entry icon. posStart is relative to the current tile entry (see menuList), regardless of posType. size must be >0 and <=256x256, otherwise 256x256 is used.No, noposStart, size
menuListNameMenu entry name text. posStart is relative to the current tile entry (see menuList), regardless of posType.No, noposStart, size
menuActiveEntryIconIcon for the currently active menu entry. size must be >0 and <=256x256, otherwise 256x256 is used.No, yesposStart, size
menuActiveEntryNameName text for the currently active menu entry.No, yesposStart, size
menuActiveEntryAuthorAuthor text for the currently active menu entry.No, yesposStart
menuActiveEntryVersionVersion text for the currently active menu entry.No, yesposStart

The 'assets' group is optional, it is only used with .romfs themes. The 'path' and 'imageSize' settings are required. imageSize[0-1] must be >0, and <= 1280x720. For some objects, the imageSize must match the internal imageSize for certain layout objects. The 'path' is the file-path to load the asset from, this is relative to "{mount-name}:/". imageSize is the size of the image, for non-.bin this must match the image size for the loaded file.

When an asset object is not specified, the settings are invalid, or loading the file fails, the default asset is used (if any).

The 'path' must have one of the below extensions:

  • ".bin": Raw image without a header (the default images also use this). imageSize directly controls the size to load from here, the filesize must match width*height*{pixel-byte-size}.
  • ".jpg"/".jpeg": JPEG, if you need transparency use PNG instead.
  • ".png": PNG, background-color is black(all-zero) when the input PNG uses alpha and the target format is RGB24.

The pixel formats listed below are the formats used internally, the image-loading libraries handle converting the image to the required format where needed (except for .bin which uses the listed format directly).

Asset objects:

Layout object nameDescriptionPixel formatOnly alpha component is used, with RGB from textColor used insteadSize which the imageSize must match, from the internal layout object field
battery_iconBattery icon.RGBA32YesNone
charging_iconBattery charging icon.RGBA32YesNone
folder_iconFolder/directory icon.RGB24No256x256
invalid_iconIcon displayed when loading the app's icon failed.RGB24No256x256
theme_icon_darkDefault icon displayed in the Theme Menu for darkTheme.RGB24No256x256
theme_icon_lightDefault icon displayed in the Theme Menu for lightTheme.RGB24No256x256
airplane_iconIcon displayed when nifmGetInternetConnectionStatus fails.RGBA32YesNone
wifi_none_iconIcon displayed for wifi with signal strength 0.RGBA32YesNone
wifi1_iconIcon displayed for wifi with signal strength 1.RGBA32YesNone
wifi2_iconIcon displayed for wifi with signal strength 2.RGBA32YesNone
wifi3_iconIcon displayed for wifi with signal strength 3.RGBA32YesNone
eth_iconIcon displayed when connected to the Internet via Ethernet.RGBA32YesNone
eth_none_iconIcon displayed when using Ethernet, with no Internet connection.RGBA32YesNone
background_imageBackground image. Optional, not set with the defaults. See layout.backgroundImage.RGB24NoNone

File-association cfg files can optionally be loaded from SD "/config/nx-hbmenu/fileassoc/" during startup. There's 1 .cfg file for each app. During normal menu scanning, hbmenu will check for file_extensions/filenames from fileassoc cfg with the dir-list filename, when the file is not recognized otherwise (likewise for directories). This is processed in the same order that the cfg was loaded from SD / same order specified in the cfg file.

When processing directories where no NRO was detected, hbmenu will go through the dir-listing and use the first entry where the filename matches a fileassoc entry where filename is specified (file_extension entries are skipped).

The generated menu entry launches the specified app_path where the first passed argument (argv[1] in the launched app) is the absolute filepath for the associated file. See below regarding the icon used for the menu entry. The author and version fields for the menu entry are loaded from app_path, while the name is the filename (unless a directory is being processed, in this case the directory name is used). When {$FILEPATH with extension changed to .nacp} exists, the aforementioned strings will be loaded from there instead.

The only optional setting is icon_path and app_args. All paths are absolute. Icon will attempted to be loaded from the following: {$FILEPATH with extension changed to .jpg} -> icon_path setting if it exists (target setting -> main file_assoc setting) -> icon from app_path.

If you have targets where file_extension and filename both have the same extension, the filename target should be located before that file_extension target in the cfg. Targets which have both file_extension and filename settings are ignored. Each target must have either a file_extension or filename setting.

app_args specifies the args to pass following argv[0](app-path). This is an array of strings for each argv[N+1]. If a "%f" token is found (only one per array index is handled), it's replaced with the path for the fileassoc. If no "%f" token is specified or app_args is not specified, the fileassoc path is passed to argv[1].

Sample fileassoc file:

fileassoc={ app_path="/switch/myapp/app.nro"; icon_path="/switch/myapp/myicon.jpg"; app_args = ["arg1", "arg2", "%f"]; targets=( { file_extension=".ext3"; icon_path="/switch/myapp/myicon2.jpg"; app_args = ["arg1", "arg2", "--path=%f"]; // Optional, overrides fileassoc.app_args. }, { file_extension=".ext4"; icon_path="/switch/myapp/myicon3.jpg"; }, { filename="main.py"; icon_path="/switch/myapp/myicon4.jpg"; } );};
Homebrew Menu - Nintendo Switch Brew (2024)

References

Top Articles
Oodweynenews
190000 Km To Miles
Corgsky Puppies For Sale
Luxiconic Nails
Void Client Vrchat
Butte County Court Oroville Ca
Taterz Salad
Trinket Of Advanced Weaponry
Wdel News Today
Domino Near
Blaire White's Transformation: Before And After Transition
Netflix Phone Number: Live Human Help - Netflix - Claimyr
Church Bingo Halls Near Me
Costco Plaza Alhambra Photos
Cheap Motorcycles For Sale Under 1000 Craigslist Near Me
Zen Leaf New Kensington Menu
Pdinfoweb
Weather In Allentown-Bethlehem-Easton Metropolitan Area 10 Days
Logisticare Transportation Provider Login
Healthstream Mobile Infirmary
Rolling-Embers Reviews
Brublackvip
Lux Nails Mcmurray Pa
Build a Free Website | VistaPrint
Trailmaster Fahrwerk - nivatechnik.de
Facebook Marketplace Winnipeg
Agility Armour Conan Exiles
Carlynchristy
Brgeneral Patient Portal
Bbc Weather In Mallorca
Cashflow Manager Avid
Ewing Irrigation Prd
6173770487
What Are Cluster B Personality Disorders?
Coacht Message Boards: A Comprehensive - Techbizcore
Oriley Auto Parts Hours
Priscilla 2023 Showtimes Near Regal Escondido
Craigslist For Pets For Sale
Southwest Flight 238
Does Lowes Take Ebt
Tillamook Headlight Herald Obituaries
Old Navy Student Discount Unidays
Maria Butina Bikini
Rocky Aur Rani Kii Prem Kahaani - Movie Reviews
Craigslist Free Stuff Bellingham
St Anthony Hospital Crown Point Visiting Hours
Craigslist Apartments For Rent Imperial Valley
Daily Cryptoquip Printable
I spruced up my kitchen for £131 - people can’t believe it’s the same room
Right Wrist Itching Superstition
Kentucky TikTok: 12 content Bluegrass State creators to know
Latest Posts
Article information

Author: Gregorio Kreiger

Last Updated:

Views: 6033

Rating: 4.7 / 5 (77 voted)

Reviews: 84% of readers found this page helpful

Author information

Name: Gregorio Kreiger

Birthday: 1994-12-18

Address: 89212 Tracey Ramp, Sunside, MT 08453-0951

Phone: +9014805370218

Job: Customer Designer

Hobby: Mountain biking, Orienteering, Hiking, Sewing, Backpacking, Mushroom hunting, Backpacking

Introduction: My name is Gregorio Kreiger, I am a tender, brainy, enthusiastic, combative, agreeable, gentle, gentle person who loves writing and wants to share my knowledge and understanding with you.