Skip to content

v0.32.0

Choose a tag to compare

@github-actions github-actions released this 03 Jul 23:07
· 26 commits to main since this release
86d2b50

[0.32.0] - 2026-07-03

Changed

  • Hyperion's interface was rebuilt on the HeroUI component library for a cleaner, more modern look. Buttons, switches, inputs, chips/badges, dialogs, context menus, tooltips and toasts are now real HeroUI components (rounded surfaces, borderless fills, the Inter typeface) instead of hand-styled boxes, and the old Material UI dependency was removed entirely (a smaller app bundle as a result). The default highlight color is now a blue accent, and Settings > General gains a "Color" picker - a row of swatches (blue, cyan, green, yellow, orange, red, pink, purple) that recolors every button, switch, tab and highlight across the app instantly (including the first-run setup screen) and persists across sessions. All dialogs and right-click menus follow the selected color consistently, with semantic red reserved for destructive actions, and every icon in the app is now a clean Lucide line-icon - the Material Symbols icon font was removed entirely. Downloads status is color-coded (installed = green, downloaded = blue), buttons show the pointer cursor, and the decorative accent bars on top of dialogs were dropped.
  • One tab pattern everywhere: Settings, App Logs and the mod-details modal share the same underline tab rail (sentence-case label with an accent underline on a divider line), and sub-tabs inside a section (the conflict inspector's Paths / .archive split) use a compact segmented pill control so two underline rails never stack.
  • Settings was reorganized into single-column cards: each setting is one card with an icon tile, title and description up top and its control beside the title (a real HeroUI switch for auto-install) - no more side-by-side explanation column. The About tab was cleaned up: version/license/unofficial are proper info chips (never button-like), the project/support/credits content reads top-to-bottom, and outbound links are clearly salient accent-tinted buttons.
  • The sidebar was tidied: the account avatar, nav icons and Settings gear now sit on one exact vertical axis, nav icons are slightly larger, the first item is labeled "Mods" (with a proper stacked-boxes icon instead of an empty square), the avatar follows the chosen accent color, and the account tier chip is a real HeroUI chip - Premium keeps its gold, Free follows the accent color.
  • The language selector moved to the app header (a compact translate-icon button beside App Logs, opening a "Choose a language" popover in the HeroUI style) and was removed from Settings > General; the setup wizard uses the same icon button. The setup/welcome flow itself was restyled to the HeroUI look (surface cards, Inter headings, accent icon tiles).
  • The splash screen was redesigned to match the HeroUI look: a flat rounded dark card with the brand mark and progress bar tinted in the user's chosen accent color (no more fixed-yellow glow effects).
  • Close buttons across dialogs use the HeroUI CloseButton, header window controls share the same icon-button chrome as the language/App Logs buttons, toolbar buttons and search fields share one 40px height, tooltips use readable Inter sentence-case copy, remaining thin white inset borders were removed in favor of background-shift hover feedback, and scrollbars are now neutral gray instead of accent-tinted.
  • Drop shadows were removed from every floating surface - modals (mod details, delete/confirm dialogs, FOMOD installer, App Logs), context menus, popovers, toasts, tooltips, the bulk-selection bar and the install overlay now separate from the page through their border and the dimmed backdrop alone, in both light and dark modes.
  • Switching between light and dark now cross-fades smoothly - the whole frame fades on the GPU (View Transitions API) instead of hard-flipping in one frame, so it stays fluid no matter how much is on screen; the header's light/dark/system toggle also matches the height of the buttons beside it.
  • The sidebar Launch Game states joined the HeroUI look: Launching / In Game / Close Game / disabled are now borderless tinted fills (accent, green, red, neutral) with sentence-weight text - no more dark outline boxes with washed uppercase labels - and the off-state switch track is clearly visible in dark mode too.
  • The FOMOD installer joined the HeroUI look: accent icon tile + sentence-case mod name in the header (with a close button, previously missing), the step progress became a rounded track beside the step counter instead of a bare line on the modal's top edge, group/preview labels dropped the tiny uppercase microtype, option cards are borderless surfaces with proper hover states, and "required"/"all selected" are real HeroUI chips. The header self-update button, the drag-to-top-level header state, the separator drop-target row, and the separator "N mods" count (now a real chip that no longer melts into the bar) followed suit - all mode-aware, no more fixed dark fills in light mode.
  • Jumping to a conflicting mod now flashes the target row. Clicking GO in the conflict overlay already scrolled to and selected the mod, but the arrival cue was a barely-visible 1px ring - it's now an unmistakable accent-colored background flash that fades out, in both color modes. The overlay rows themselves were also made readable in light mode (their text used fixed dark-mode colors), and the stray yellow hairline that could appear under a selected conflicting mod on hover (a leftover of the old yellow accent) now follows the accent color.
  • The whole renderer is now token-driven - the final light-mode sweep. Roughly 80 remaining hardcoded dark-mode colors (row/cell grays, dialog text, progress rows, validation copy, status readouts) were mapped to the theme tokens, and the pale status-text pastels (mint/rose/amber/blue used on tinted fills) became mode-aware tokens with dark readable shades in light mode. Only the fixed-meaning status hues, per-type colors and dark-text-on-colored-fill hover pairs remain literal - by design.
  • A batch of light-mode legibility fixes: clicking a text field no longer draws the boxy focus outline (fields keep their background-shift feedback; the keyboard focus ring stays for buttons/controls), text selection follows the accent color instead of the legacy yellow, the Settings > Nexus tier-comparison cards use dark readable amber/blue in light mode, switches that are off get a visibly darker track, the sidebar Mods icon uses a lighter-weight glyph so it no longer reads darker than its neighbors, and App Logs got a real light-mode pass - method/level/status tags are proper HeroUI chips and the payload inspector is an always-dark code surface so its syntax colors stay readable in both modes.

Added

  • Launching the game now shows what's happening. The launch pipeline (scanning mods, mounting the virtual file system, compiling REDmods, starting the game) always reported progress internally, but the UI never showed it - the sidebar just spun on "Launching...", which read as frozen during the multi-minute first REDmod compile. A floating status card now narrates each step with a progress bar, supports cancelling the preparation steps, auto-dismisses on success, and keeps errors visible with details.
  • REDmods now actually work. Installing a REDmod used to look fine but silently do nothing in game - the required compile step never ran. At launch, when enabled mods include REDmod content, Hyperion now runs the official redMod.exe deploy inside the virtual file system: the tool sees the virtual mods/ folder, its compiled output is captured into Runtime Captures instead of dirtying the game folder, and the game is started with -modded so the mods load. The slow compile is skipped on later launches when the enabled REDmod set hasn't changed, deploy progress shows in the launch overlay (and can be cancelled), and if the REDmod DLC isn't installed the launch continues normally with a warning instead of failing. REDmod load order follows your library order - the mod lower in the list wins conflicts, exactly like the rest of Hyperion's priority system (with an automatic fallback to REDmod's default order if the tool rejects the list).
  • Light mode. A new light / dark / system toggle lives in the header (following the OS scheme live when set to system, the default). Light mode mirrors HeroUI's light scheme - light-gray canvas with white elevated cards - and works with every accent color; the splash screen follows the same mode and accent.

Removed

  • The JSON theme system (Dark/Clean theme selector, the Themes folder, and community-theme support) was removed before ever shipping - visual customization is now the single accent-color picker, which covers the same need with far less complexity.

Performance

  • The app opens faster - fonts no longer come from the internet. Every cold start used to fetch Inter/Syne/Oxanium/JetBrains Mono from Google Fonts with text hidden until they arrived, and the boot sequence waited up to 1.8s for them (including two fonts that were removed from the project long ago and could never load). All fonts are now bundled inside the app, so they load from disk in milliseconds, the boot no longer waits on the network, and Hyperion starts identically offline.
  • The renderer no longer holds every mod's full file list in memory. Library scans used to ship each mod's complete file array (and archive-resource index) over IPC and keep them resident in the UI store - tens of MB with a 2,000-mod library, re-serialized on every scan. Bulk scan results now cross the IPC boundary slimmed to what the UI actually renders, plus a precomputed tracked-resource count that keeps the "fully redundant" conflict math exact; the mod-details Files tab still gets the real file list from its dedicated on-open refresh. The conflict pass also caches each mod's derived deploy paths, so recomputing conflicts on an unchanged library reuses them instead of re-deriving ~1M paths.
  • Large libraries got dramatically cheaper to scan. Every library scan (boot, install, delete, enable/disable) used to re-read and re-parse every mod's _metadata.json AND archive sidecar from disk - with 2,000 mods that's ~4,000 file reads per scan, several times per action. Mod metadata is now cached in memory and validated by each file's on-disk identity (mtime + size), so a scan of an unchanged library costs two cheap stat calls per mod; external edits still surface naturally. Locating a mod's folder by id (enable/disable/rename) also uses a direct hint instead of walking the whole library.
  • The Nexus download registry no longer re-reads itself per lookup. Every registry lookup used to re-read the registry JSON from disk and existence-check every record - and the Downloads refresh performs one lookup per archive, so a large folder turned one refresh into millions of file-system calls. The registry now lives in memory with an O(1) path index; dead records are swept at natural write points instead of on every read. The Downloads list cap was also raised from 500 to 10,000 archives.
  • Scrolling Downloads with 120+ archives is smooth again. Above that size the list windows its rows, but the scroll position that drives the windowing lived in the whole Downloads screen - so every scroll frame re-rendered the entire screen (toolbar, dialogs, sort pipeline and all rows), which read as ~30fps. The scroll state now lives in a small dedicated row-list component (the same isolation the mod library uses), rows are memoized so a scroll frame only renders the rows entering the viewport, and the scroll container gets its own composited layer.

Fixed

  • Closing Hyperion while Cyberpunk is running no longer pulls the mods out from under the game. Quitting used to tear the virtual file system down unconditionally, making every mod file vanish mid-session for a game that was still running (and moving runtime files while the game was still writing them). Hyperion now detects that the game is still attached and leaves the virtual layer alive; the cleanup happens safely on the next start instead.
  • Loader files staged into the game folder can no longer be orphaned by a crash. The few physical bootstrap files Hyperion stages for early-init frameworks (e.g. CET's version.dll) were tracked only in memory - if Hyperion crashed or was killed while the game ran, they stayed in the game folder forever, even after disabling the mods. Staging is now recorded in a small manifest on disk, and a sweep on the next startup (or the next launch) removes exactly what a previous session left behind.
  • Launching the game twice in quick succession can no longer reset the virtual file system under a game that just started. A second Launch click (the "in game" state takes a few seconds to appear) now gets a clear "already running" response instead of remounting.
  • The end-of-game detection is more tolerant of transient hiccups: it now requires two consecutive "game gone" checks (8 s) before unmounting, so a momentary process-listing failure can't tear the mods away from a game that is still running.
  • Background process checks (tasklist/taskkill) now run with hidden windows, preventing brief console flashes in the packaged app.

Security

  • The Nexus API key is now stored encrypted in installed builds. It used to sit in plain text inside settings.json; installed builds now encrypt it with the operating system's credential protection (DPAPI on Windows) and existing plaintext keys migrate automatically on the next start. If the settings file is copied to another machine or user account the key simply won't decrypt - re-enter it in Settings > Nexus. (In npm run dev the key is kept in plain text because the dev session's encryption key is intentionally throwaway per run; encryption applies to the packaged app only.)
  • The account API key no longer travels into App Logs at all. Request logs used to carry the full key internally (masked in the UI, but revealable); now only a masked form ever reaches the log store, so neither the reveal toggle nor copy can expose it - including the key field that the Nexus validate response echoes back in its response body, which was previously logged raw. The short-lived per-download token keeps its reveal for debugging - it expires in minutes and is useless without the account key.
  • Nexus API requests now refuse to follow redirects, so the authentication header can never be handed to a different host, and CDN downloads cap redirect chains instead of following them forever.
  • Rate limiting is handled gracefully: hitting the Nexus API limit now produces a clear "rate limit reached, retry in Xs" message instead of a raw error body, and each request log entry records the remaining hourly/daily quota so exhaustion is diagnosable from App Logs.