Skip to content

Next Release - #421

Draft
networkfusion wants to merge 327 commits into
mainfrom
develop
Draft

networkfusion wants to merge 327 commits into
mainfrom
develop

Conversation

@networkfusion

@networkfusion networkfusion commented Sep 11, 2026 •

Copy link
Copy Markdown
Collaborator

Description

Changes for next release

Motivation and Context

How Has This Been Tested?

Screenshots

Types of changes

  • Improvement (non-breaking change that adds a new feature)
  • Bug fix (fixes an issue)
  • Breaking change (breaking change)
  • Documentation Improvement
  • Config and build (change in the configuration and build system, has no impact on code or features)

Checklist:

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

You agree with the license terms and that other license types may be granted with permission of the original N64FlashcartMenu project license holders.

Signed-off-by: GITHUB_USER <GITHUB_USER_EMAIL>

Summary by CodeRabbit

  • New Features

    • Added JPEG support for backgrounds, box art, cover art, and the image viewer.
    • Added embedded ROM metadata images, screenshots, descriptions, and expanded metadata support.
    • Added file-type icons, custom background music, and SNK Neo Geo loading support.
    • Added N64-focused development and hardware deployment documentation.
  • Bug Fixes

    • Improved startup stability, including a fix for Zelda OOT crashes.
    • Added low-voltage startup protection and improved image-loading error handling.
  • Documentation

    • Updated image format, metadata, music customization, and release documentation.

It causes too much slowdown when loading directories.
Use standard types for diskswaps
<!--- Provide a general summary of your changes in the Title above -->

## Description
<!--- Describe your changes in detail -->
Renames the cheat files from `.datel.txt` to `.datel`.
`.datel.txt` files will continue to be loaded, but new ones will conform
to the new extension.
Makes future support for hiding the files from the browser easier.

## Motivation and Context
<!--- What does this sample do? What problem does it solve? -->
<!--- If it fixes/closes/resolves an open issue, please link to the
issue here -->
The `.txt` extensions were only due to be used for debugging.

## How Has This Been Tested?
<!-- (if applicable) -->
<!--- Please describe in detail how you tested your sample/changes. -->
<!--- Include details of your testing environment, and the tests you ran
to -->
<!--- see how your change affects other areas of the code, etc. -->

## Screenshots
<!-- (if appropriate): -->

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [x] Improvement (non-breaking change that adds a new feature)
- [ ] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [x] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
- [ ] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.


You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

<!--- It would be nice if you could sign off your contribution by
replacing the name with your GitHub user name and GitHub email contact.
-->
Signed-off-by: GITHUB_USER <GITHUB_USER_EMAIL>
TODO: Implementation is incomplete.
The patterns "/src/libs/**" and "/libdragon/**" would fail to exclude those directories. DocFX matches exclude patterns against relative paths (e.g., src/libs/file.md), and a leading slash is treated as a literal character.
… in the same fields.

extract_rom_info assigns string literals (e.g., "Unknown") to rom_info->meta.* fields. Later, load_rom_meta_from_file may overwrite these with strdup'd heap pointers. This creates ambiguous ownership — callers cannot safely free() these fields without knowing whether a .meta file was loaded.
…sure the heap-allocated metadata strings are freed whenever you're clearing or replacing the ROM information.
This is an extra option that aids debugging remotely and stops the need for uploading files to the SD card.
It is particularly helpful now that there seems to be an issue with the file size of the menu causing timeout issues with the deployer.
<!--- Provide a general summary of your changes in the Title above -->

## Description
<!--- Describe your changes in detail -->
Switches to `snprintf` where possible.
Updates music player to use standard types for duration.

## Motivation and Context
<!--- What does this sample do? What problem does it solve? -->
<!--- If it fixes/closes/resolves an open issue, please link to the
issue here -->

## How Has This Been Tested?
<!-- (if applicable) -->
<!--- Please describe in detail how you tested your sample/changes. -->
<!--- Include details of your testing environment, and the tests you ran
to -->
<!--- see how your change affects other areas of the code, etc. -->

## Screenshots
<!-- (if appropriate): -->

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [ ] Improvement (non-breaking change that adds a new feature)
- [ ] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [ ] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
- [ ] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.


You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

<!--- It would be nice if you could sign off your contribution by
replacing the name with your GitHub user name and GitHub email contact.
-->
Signed-off-by: GITHUB_USER <GITHUB_USER_EMAIL>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Improved stability and security by replacing unsafe string formatting
with size-limited formatting across several menu UI components (prevents
buffer overruns).
* Strengthened error/path messaging by bounding message writes and
unique filename handling.
* Improved music player duration display by refining numeric casting for
consistent formatting.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Related to controller pak management.
And book keeping.
Add message for note restore.
Add tip about not needing to process ROM's
Add note on known issue.
Improve debug notes.
Add gopher64 emu.
Improve comments
Add ext to message
networkfusion and others added 5 commits September 11, 2026 21:26
Until we can get to the bottom of issues with the SC64 (firmware?).
<!--- Provide a general summary of your changes in the Title above -->

## Description
This commit moves to using L/R consistently for switching between tabs
and cleans up the associated text.

## Motivation and Context
This is a tiny prerequisite for the Settings tab and the Theme work.

## How Has This Been Tested?
This was tested in ares with the necessary SC64 patch.

<!-- (if applicable) -->
<!--- Please describe in detail how you tested your sample/changes. -->
<!--- Include details of your testing environment, and the tests you ran
to -->
<!--- see how your change affects other areas of the code, etc. -->

## Screenshots
<!-- (if appropriate): -->

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [X] Improvement (non-breaking change that adds a new feature)
- [ ] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [ ] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
- [X] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [X] All new and existing tests passed.


You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

<!--- It would be nice if you could sign off your contribution by
replacing the name with your GitHub user name and GitHub email contact.
-->
Signed-off-by: rmmh <hitchmanr@gmail.com>

Co-authored-by: Robin Jones <networkfusion@users.noreply.github.com>
Add time to action bar.
Add VI->CR reset
john-steinmeyer and others added 10 commits September 25, 2026 07:37
## Description
Two fixes for "Set ROM to autoload", which is back on by default in
develop.

set_autoload_type() saved `browser.directory` and `browser.entry->name`.
When the ROM's details were opened from the History or Favorites tab,
those are left over from the browser and can be a different file. It now
saves the folder and file name of `menu->load.rom_path`, the file the
screen loaded.

The path is rebuilt from `menu->storage_prefix` before it is split.
Bookkeeping loads its paths with `path_create()`, whose root is the
start of the string, so `path_pop()` on a ROM in the SD card's root
folder would leave `sd:`.

Holding Start while the menu starts set `rom_autoload_path` and
`rom_autoload_filename` to string literals, and set_autoload_type()
frees both, so cancelling autoload and then setting a ROM in the same
session freed a literal. Startup now frees the old strings and stores
`strdup("")`.

Not in here: view_load_rom_init() skips its path selection, and later
its box art and options menu setup, whenever `rom_autoload_enabled` is
set, so details opened after a set in the same session keep the earlier
ROM's path, and after a failed autoload boot they have none. #423
changes both gates to `load_pending.rom_file`, so I left them to #423.

## Motivation and Context
I ran into the first one in my fork, which has autoload compiled in.
After I set a game to autoload, the next start stopped at "Couldn't open
ROM file". The menu's log showed it trying to load `sd:/cpak_saves`, the
folder the file browser had highlighted in the SD card's root, not the
game. I found the second while reading the same code.

## How Has This Been Tested?
On an SC64, with these two changes in my fork, which is 0.3.4 with
autoload compiled in, plus the same init gate change as #423. Set a ROM
to autoload from the browser, from Favorites and from History, one in a
subfolder and one in the SD card's root, power cycling after each: the
ROM I set booted every time, the root-folder one from History included.
Held Start at power-on and set another ROM in the same session: it
booted. Deleted the autoload ROM and power cycled: the "Couldn't open
ROM file" box, then B, opened a game from Favorites and booted it.

I also compiled path.c on a PC and checked what the old and new code
save against what startup.c opens on the next boot, for ROMs in the root
folder, one folder deep and three deep, with the path built from the
browser and from `path_create()` as History's is. The new code opens the
right file in every case, and matches what the old code saved when the
path comes from the browser.

## Types of changes
- [ ] Improvement (non-breaking change that adds a new feature)
- [x] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [ ] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
- [x] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.

You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

Signed-off-by: john-steinmeyer <john@steinmeyer.ca>
## Description
This unifies the various settings menus into a single tab.

## Motivation and Context
More complex settings options benefit from a dedicated interface. This
PR is the last prerequisite for my theme work.

Unfortunately it's rather large, because a large amount of UI code had
to be adjusted to work in the new pane format.

## How Has This Been Tested?
This has been tested in-emulator and on-hardware, and all functions
appear to be working.

## Screenshots
<img width="616" height="472" alt="image"
src="https://github.com/user-attachments/assets/b609c851-3740-4c96-a21c-5998a02d881d"
/>
<img width="617" height="471" alt="image"
src="https://github.com/user-attachments/assets/df06f32f-0621-4f3f-92cb-008d8c3062a1"
/>
<img width="611" height="463" alt="image"
src="https://github.com/user-attachments/assets/9ed4bf64-e815-478a-8b06-8f02c0962c8e"
/>
<img width="614" height="465" alt="image"
src="https://github.com/user-attachments/assets/c8169a9b-fae3-4c48-8307-eb39aa510a7b"
/>
<img width="609" height="476" alt="image"
src="https://github.com/user-attachments/assets/e9bee315-2dfe-4ab2-a7fe-ca58383aa9ce"
/>
<img width="612" height="470" alt="image"
src="https://github.com/user-attachments/assets/baadea64-e5b5-4766-83f0-e3778fead629"
/>
<img width="613" height="468" alt="image"
src="https://github.com/user-attachments/assets/cf892580-b62f-4c84-9981-937210ded57f"
/>


## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [X] Improvement (non-breaking change that adds a new feature)
- [ ] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [ ] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
- [X] My code follows the code style of this project.
- [X] My change requires a change to the documentation.
- [X] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [X] All new and existing tests passed.


You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

<!--- It would be nice if you could sign off your contribution by
replacing the name with your GitHub user name and GitHub email contact.
-->
Signed-off-by: rmmh <hitchmanr@gmail.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a Settings tab with category navigation and panes for menu
options, time, Controller Pak, flashcart, N64 information, and credits.
* Added scrolling, selection highlights, contextual hints, and
confirmations for sensitive settings actions.
* Added a Controller Pak manager shortcut from file options and updated
controls for switching tabs and opening settings.
* Added options to clear the Autoload ROM target from Settings or during
startup.
* **Improvements**
* ROM details now keep existing artwork visible while replacement
artwork loads; Back closes information panels before leaving.
  * PNG images with transparency now retain their transparent areas.
* **Documentation**
* Updated menu, browser, settings, and Controller Pak instructions for
the revised navigation and controls.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Robin Jones <networkfusion@users.noreply.github.com>
This includes simple gradient backgrounds and retains the custom
background image support. It adds a theme picker and custom theme
editing in settings.

## Description
This allows users to set a theme for their launcher menu.

## Motivation and Context
This allows improving and customizing the styling of the base menu
beyond the default black-and-white.

## How Has This Been Tested?
This has been tested in emulator and on hardware, and with a test suite
that relies on ares-64 with merged SC64 emulation support and a few
other things.

## Screenshots
<img width="634" height="488" alt="image"
src="https://github.com/user-attachments/assets/9adb2059-cf10-463a-a3e1-90f432781ba1"
/>
<img width="625" height="478" alt="image"
src="https://github.com/user-attachments/assets/f395c1e0-47a1-4077-8943-aec2e80d494f"
/>


## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [X] Improvement (non-breaking change that adds a new feature)
- [ ] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [ ] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
- [X] My code follows the code style of this project.
- [X] My change requires a change to the documentation.
- [X] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [X] All new and existing tests passed.


You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

<!--- It would be nice if you could sign off your contribution by
replacing the name with your GitHub user name and GitHub email contact.
-->
Signed-off-by: rmmh <hitchmanr@gmail.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added a Theme settings pane with preset selection, live previews, and
custom controls for colors, hue, and panel opacity.
* Added built-in theme palettes and support for custom image
backgrounds, including options to set or remove a background.
* Theme choices and custom settings are saved and restored between
sessions.
* Updated menu colors, text, panels, and selection indicators to follow
the active theme.

* **Documentation**
* Expanded the menu guides with instructions for choosing, editing, and
saving themes.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
<!--- Provide a general summary of your changes in the Title above -->

## Description
<!--- Describe your changes in detail -->
Improve Expansion pak handling:
Remove enhanced and add unused.

## Motivation and Context
<!--- What does this sample do? What problem does it solve? -->
<!--- If it fixes/closes/resolves an open issue, please link to the
issue here -->

DragonMinded/libdragon@ab36be7

It will allow improved detection (ROM DB or homebrew).

## How Has This Been Tested?
<!-- (if applicable) -->
<!--- Please describe in detail how you tested your sample/changes. -->
<!--- Include details of your testing environment, and the tests you ran
to -->
<!--- see how your change affects other areas of the code, etc. -->

## Screenshots
<!-- (if appropriate): -->

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [x] Improvement (non-breaking change that adds a new feature)
- [ ] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [ ] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
- [ ] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.


You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

<!--- It would be nice if you could sign off your contribution by
replacing the name with your GitHub user name and GitHub email contact.
-->
Signed-off-by: GITHUB_USER <GITHUB_USER_EMAIL>
Don't show "[DIR]" in file list now that we have the file type sprites. The function is kept commented out to allow for the future option of not showing the filetype sprites.
Generated asset files are now output to the DFS filesystem within the `menu` directories.
Each asset type is now contained within a subdirectory.
This ensures that `make clean` is able to clean generated files, and also make it easier for users to check.
networkfusion and others added 11 commits September 29, 2026 19:40
Add `N64_ROM_EXPANSIONPAK = recommended`.
This keeps the menu metadata up-to-date and dogfoods.
Add checksum match to boot.c
Default to NTSC TV region for the China destination code. It is technically incorrect considering that China is a PAL region, however the iQue only outputted NTSC, and the compatible ROMs seem to align with that.

See #396 (comment) for further details, and this commit should be re-visited.
It is going to be very hard to support.
ED64 pro was removed.
Grid is an artwork view of the N64 ROMs directly inside one library
directory, and the first of the main tabs. It needs menu/metadata for
names and artwork; without it, the Grid tab and its settings are hidden
and the menu uses Files.

<!--- Provide a general summary of your changes in the Title above -->

## Description

Browsing:
- Tiles show box or cartridge art (Z), with the title as a marquee.
- C-Up sorts by title, keeping a manual arrangement made by holding A
and moving a tile; C-Left sorts by release date; C-Right groups by first
author. Sort changes keep the selected ROM.
- A opens ROM details, Start launches immediately, stopping at the
Expansion Pak warning when needed. B and details return to Grid.
- Decoded artwork is kept in a 2 MiB cache when memory allows, including
while ROM details are open.

Index:
- ROM details, arrangement, and view choices are cached in
menu/cache/grid.index. The first time Grid opens after boot, and after
Files deletes or extracts anything, it lists the library and reads only
new ROMs; 41 cached ROMs sync in about 40 ms instead of 2 s. Slow scans
show a progress bar.
- Up to 512 ROMs; subdirectories, other menus' ROMs, and system files
such as macOS "._" companions are skipped.
- If the library can't be read, the index is kept and the empty Grid
names the directory and how to change it.

Settings and Files:
- Settings > Menu gains Boot Into (Grid or Files), Grid Library, and
Grid Cache, which shows the ROM count and deletes the index on A.
- Files' context menu gains Set as Grid library directory.
- The menu checks for an Expansion Pak at startup so libdragon does not
warn when Grid allocates past 4 MiB.

## Motivation and Context
The Grid tab makes choosing a ROM more graphically satisfying by using
the graphical metadata.

<!--- What does this sample do? What problem does it solve? -->
<!--- If it fixes/closes/resolves an open issue, please link to the
issue here -->

## How Has This Been Tested?
This has been tested extensively in emulator and on hardware, and had
several rounds of refinement for the UI.

The grid is invisible if there's no menu/metadata on the SD card, since
that means there won't be any images, and does not increase boot time
for the menu. The first visit to the grid tab may take several seconds
to build the index, but has a progress bar.

## Screenshots
<img width="611" height="472" alt="image"
src="https://github.com/user-attachments/assets/c2ba5b3d-feeb-47a1-a3d1-ca9bf0565ec9"
/>
<img width="632" height="489" alt="image"
src="https://github.com/user-attachments/assets/a066ea8b-d0f9-4b69-94ff-f9b97cbde4eb"
/>

## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->
- [X] Improvement (non-breaking change that adds a new feature)
- [ ] Bug fix (fixes an issue)
- [ ] Breaking change (breaking change)
- [ ] Documentation Improvement
- [ ] Config and build (change in the configuration and build system,
has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->
- [X] My code follows the code style of this project.
- [X] My change requires a change to the documentation.
- [X] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [X] All new and existing tests passed.


You agree with the license terms and that other license types may be
granted with permission of the original `N64FlashcartMenu` project
license holders.

<!--- It would be nice if you could sign off your contribution by
replacing the name with your GitHub user name and GitHub email contact.
-->
Signed-off-by: rmmh <hitchmanr@gmail.com>

---------

Co-authored-by: Robin Jones <networkfusion@users.noreply.github.com>
libdragon was archived. As a stepping stone, the new link is n64brew.
This repo has moved orgs and requires a different devcontainer cache.
The repo owner also needs changing.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants