Skip to content

Instantly share code, notes, and snippets.

@StringEpsilon
Last active July 4, 2025 20:45
Show Gist options
  • Save StringEpsilon/5efe31988d3209946e53ef1db193b65e to your computer and use it in GitHub Desktop.
Save StringEpsilon/5efe31988d3209946e53ef1db193b65e to your computer and use it in GitHub Desktop.
UI changelog

UI Changes

New custom made design!

Header

  • Status information is displayed in a more direct fashion.
  • Removed the "power" button that was just a link to the mapper tab.
  • Added a button to unload the current mapper.
  • Added a button to reload the current mapper.
  • Added a button to toggle advanced mode.

image

Advanced mode

Some UI elements are now only shown when the "advanced mode" is active. This mode can be toggled by clicking on the rocket icon in the header.

  • Disabled by default
  • If disabled, the following features are hidden by default (compared to the old version).
    • "Open mapper folder" and "open archive folder" buttons in the mapper management tab.
    • The "Settings" tab.
    • The property details table (the fold-out that shows type, length, path, ...).

"Mapper" tab

  • Now organized in panels underneath each other, rather than tabs.
  • Poke-A-Byte will remember which panels you opened and closed. This information is stored in your browser.
  • "Open Mapper Folder" now creates a toast notification.
  • Added a filter dropdown to narrow the mapper selection by category (GEN1, GEN2, ...)

image

  • When restoring or deleting a mapper from the backups, the dialog will inform you about the files that are going to be restored / deleted.

image

"Properties" tab

  • The save icon button is only shown when a change was made (but not yet saved).
  • An undo button has been added to discard pending changes.
  • The "freeze" icon button was moved to the left side of the input.
  • When clicking on the freeze icon with a pending edit, the property will be saved as frozen with the new value. Same as if you saved first and then froze.
  • Advanced mode: The address of the property is shown to the right of the input.
  • Advanced mode: Properties can be hidden. To unhide the properties, click the eye-icon at the top of the properties page to show all hidden properties, then toggle the ones you want to display again.
  • The property details table only shows entries that have data. e.g. if a property does not have a size, then the size row is omitted.
  • Edits made in the "bytes" row can now be saved. A contextual undo button was also added.
  • When clicking on the "copy" button of the bytes row: The string copied to clipboard has a different format. Previous: "00 00 00 00" New: "0x00 0x00 0x00 0x00"
  • Removed the warning text about "deprecated" mappers.
  • Removed "unload mapper" button (see header).

Screenshot of the contextual buttons:

image image

Example of properties with address and bit information:

image

Settings:

  • When clearing your github settings, a confirmation dialog will open first.

image

Other:

  • Toast notifications now appear on the right.
  • Errors encountered by Poke-A-Byte while processing the mapper are now shown as toast notifications
    • These notifications do not automatically disappear.
    • Repeat notifications with the same text are merged.
  • If more than 5 notifications are active at the same time, a "Delete all" button is shown.
  • Added a link to a newly added license page in the footer. Click on the underlined "AGPL" to get there.
  • Various tweaks to the wording of confirmation notifications.

0.9.0

Breaking

  • Replaced the previous frontend (UI) with a new one written in Preact.

Features

  • Added Linux support for the BizHawk integration tool.
  • Added Linux support for the BizHawk driver.
  • Added a "Reload mapper" button to the property editor.
  • Reduced the download size from roughly 40mb to 10mb (zipped, exact numbers depend on platform).

Bugfixes

  • The Poke-A-Byte Integration Tool for BizHawk no longer crashes if it is closed and then re-opened in the emulator.
  • Fixed compatibility of the RetroArch driver with macOS (with a lot of help from MVF).

Performance

  • The UI should be more responsive. Having the UI open should also be less of a strain on Poke-A-Byte.
  • Improved the performance of the BizHawk driver by being smarter with the work done per read and reducing memory overhead.
  • Some minor performance improvements by not repeatedly parsing the Bits string.
  • Reduced memory footprint by getting rid of Blazor/MudBlazor.
    • This also improved performance somewhat because the update mechanism for the Blazor UI no longer exists.
  • Minor memory usage improvement by only instantiating the BizHawk and RetroArch drivers when a connection to the respective emulator can be established.
  • Fixed some minor memory leaks that occur when repeatedly loading and unloading mappers.
  • Serialize IPokeAByteProperty directly instead of using an intermediary anonymous object for the PropertiesChanged Websocket event.
  • Use one contiguous byte array for storing game memory, this skips a bunch of work to find the proper ByteArray based on address and length.
  • Reduced memory use and memory-churn.

Overall, using the Pokemon Emerald mapper (the one for an unpatched game) and BizHawk on Linux, I see a reduction in CPU usage of ~30% and a reduction of memory utilization of ~34%.

Other changes

  • The frontend no longer references public CDNs for fonts or images. This should mean Poke-A-Byte can be used offline with less problems.
  • Some calls to the GitHub API are now being cached for 60 seconds.

Changes for developers:

  • Removed the internal performance measurements and the SHOW_READ_LOOP_STATISTICS setting.
  • Removed the intermediate PropertyModel type that is returned from some REST endpoints.
    • The data given to clients may slightly differ now, but is now consistent between the REST endpoints and the WebSocket.
  • Removed the following REST endpoints:
    • files/mapper/refresh_archived_list
  • Moved the following APIs from IPokeAByteProperty to IPokeAByteInstance:
    • FreezeProperty()
    • UnfreezeProperty()
    • WriteValue()
    • WriteBytes()
  • In case of error, the REST APIs may return slightly different response bodies.
  • In some cases a 400 (Bad Request) is now a 500 (Internal Server Error).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment