3.0.0 (2026-05-30)
Bug Fixes
- acknowledge crash when plugin is disabled (a8c1d27)
- add 32-bit openssl and libidn2 to PKGBUILD makedepends (7227ba3)
- add libx11 and libxtst to PKGBUILD makedepends (4107565)
- add safe.directory for git in container (7f4fdd9)
- add workspace node_modules/.bin to PATH for sub-package builds (5948687)
- allow builder user to access workspace repo (2c95321)
- always clean up emittedPlugins when destroying a plugin (caf35e2)
- arch: build with RelWithDebInfo for debug symbol generation (edb0cf5)
- arch: convert to split package so paru can resolve millennium-debug (c1579c1)
- arch: create install directory and enable debug symbol package (0863182)
- arch: remove unused DISTRO_ARCH cmake flag (314e01b)
- arch: replace SUDO_USER-dependent home detection with passwd enumeration (785f777)
- arch: simplify PKGBUILD to single package with auto-generated debug and remapped debug paths (655350d)
- Better fallback on main browser fail in captureBrowserSnapshot (77eb09e)
- Better legacyPluginDisabledTooltip tooltip locale (05fb5b2)
- bindings: Normalize Theme color and condition values before config propagation (583fd04)
- bindings: Validate plugin install/uninstall payload keys (7ce1020)
- build paru from source, use PACMAN=paru for AUR dep resolution (3e2b83e)
- build paru-bin from AUR instead of stale prebuilt binary (859c6f7)
- build TypeScript during configure so virtfs embeds chunk files (3a5f851)
- build: add loader package to bun workspace (7373eda)
- build: add missing sstream include and remove unused set_config (23cd4c2)
- build: remove stale websocketpp add_subdirectory (e72be84)
- build: suppress compiler warnings in shared.h, loopback, and curl targets (207898f)
- bun instead of bun-bin (65809cd)
- cdp: scope Page.* blocks to SharedJSContext and forward target sessionId (830d1e1)
- cdp: support multiple event listeners per CDP event (59e93b3)
- child_process: handle ECHILD when steam reaps child before millennium (f46eb6b)
- child: prevent terminal signals from propagating to plugins (9deb2d2)
- ci: extract only main package for verification, exclude debug split (a1a59c2)
- CI: Fail compilation if MILLENNIUM_VERSION can't be found (e39cc55)
- CI: Fetch full git history so semantic-release sees all tags (4d49bb0)
- ci: move tests/ffi into workspace root to fix Windows build (d071b1b)
- ci: use millennium/ subdirectory in release artifacts (c6d7ce4)
- cmake: declare resources.rc as generated output on Windows Release (8096307)
- CMake: Prevent macOS from compiling Linux subhook source (27ae3bb)
- cmake: remove CACHE from internal set() variables (187c88e)
- cmake: resolve canonical Steam path and consolidate build messages (e55033b)
- config: eliminate race condition in config-provider sync (94d7e4d)
- correct PyUninstallPlugin FFI return type (bc92023)
- crash-modal: delay showing crash modal 5s after main window is ready (9b824ae)
- deliver pending crashes via startup config (ffe20a4)
- deploy 64-bit bootstrap and hhx64 to steamwebhelper runtime (bc0e09c)
- deploy 64-bit bootstrap in install script and CI (d70b7e9)
- disable 64-bit optional curl deps in 32-bit Linux build (59aed87)
- drop paru, install deps via pacman and bun manually (16c2f28)
- engine: make Millennium shutdown deterministic on Steam quit (f3d4f01)
- Expose webkit FFI binding per session and harden loader FFI availability check (3a43baa)
- ffi: remove dead updater FFI bindings (b922613)
- Fix AUR test slave falling behind a commit (d46c0fd)
- Fix dev build improperly resolving typescript metadata (4d84ac5)
- Fix Field in latest Steam client breaking Millennium settings (44225e6)
- Fix Millennium not starting properly when using BPM as startup location (b4d68fc)
- Fix release build (2bd1f3d)
- Fix startup issues on beta 18-20 (hopefully) (4228dd1)
- Fix theme config not saving properly across sessions (05bcb65)
- Fix ttc skipping optional call hooks (ex: memb?.fn?.()) (43273f7)
- frontend: Guard theme switching and sequence JS context reload safety (c03b1d3)
- frontend: Only restart UI when reload prompt is confirmed (b0d27c4)
- frontend: Prevent updates effect cleanup crash and restore macOS manual update action (0527e61)
- frontend: show legacy plugin warnings for already-disabled plugins (7290a44)
- frontend: theme editor dropdown and sidebar styling (99f3d8d)
- frontend: Treat RootColors as CSS text and prevent init crashes from blocking Millennium routes (059b815)
- handle numeric slider defaults in theme condition init. Closes #730 (ba269ef)
- Http: Align Internal asset interception and loopback compatibility for macOS (3214e93)
- install all build deps manually in CI, add bun install step (a28de3a)
- install.sh: chmod +x libmillennium_pvs64 and libmillennium_luavm_x86 (1004c21)
- install.sh: chmod +x libmillennium_pvs64 and libmillennium_luavm_x86 (8f6a93c)
- invalidate update cache after successful plugin update (f57fdbf)
- ipc: parse JSON-encoded strings from Lua backends (9fac1db)
- let PKGBUILD handle bun installation (896c360)
- linux: Add missing include in crash_handler (ad69e96)
- linux: add missing include in crash_report (3817b13)
- linux: Fix compilation errors in crash_handler and linux_legacy (23d67ee)
- locales: evaluate settings tab titles at render time (ee9eb71)
- locales: evaluate settings tab titles at render time (f45fa5d)
- log error code and command in CreateProcess failure (f29293b)
- loopback: scope re2 to loopback target and guard fopen_s behind WIN32 (bd4c2f2)
- lua: Make remove_browser_module shutdown-safe during backend teardown (25da728)
- macOS: Align async-ffi sources and remove stale python runtime refs (4ef0cd2)
- nix: correct stale typescript source paths (4313886)
- nix: Fixed build bug with python venv (c80aa45)
- nix: force RPATH for Steam compat (65d3966)
- only define dev path overrides in non-CI builds (1470e32)
- only reload frontend when plugins are enabled (bb805ec)
- only spawn newly enabled plugins in set_plugins_enabled (d386518)
- PKGBUILD: Remove all refs to $srcdir in release builds (f635002)
- platform: support both CEF directory variants for hardlinks (dfaba25)
- platform: use trampolines, fopen_s, WSASocketW, and drop stale includes (bfaa87f)
- pre-populate srcdir to avoid makepkg git clone issues (7c2e9e4)
- Preserve skin.json key order through the IPC layer (d6e8159)
- prevent duplicate frontend bootstrap on plugin toggle (628bde0)
- quote PKGBUILD variable expansions to handle paths with spaces (d25af28), closes #686
- remove nonexistent lib32-curl from makedepends (e5b6361)
- resolve double-log and double-unload shutdown issues (cb14bf5)
- resolve lua_host path relative to loaded library on Linux (985c6cc)
- resolve millennium-ttc via direct path instead of bin lookup (1fc7ac4)
- resolve paru download URL from GitHub API (0268301)
- resolve theme update loop and add update diagnostics (4b426ca)
- restore callable backwards compat for pre-compiled plugins (1cd2afb)
- Runtime: Make Python environment and runtime paths version-aware on Posix and Macos (34bcd5d)
- Scope deps audit to Millennium runtime env (b675d40)
- SDK: Remove IPC request timeouts (6c0368d)
- settings: restore saved tab when returning to settings (c9fa827)
- Show placeholder in Logs panel when there are no logs (5ea0e77)
- shutdown: event-driven CDP pipe cancellation on terminate (308afbf)
- silence benign CDP and VFS error logs (fa66952)
- skip runtime deps in test PKGBUILD (66415ef)
- Steam Beta: Fix component hooks causing the front-end to crash (1f50daf)
- strip steam dep instead of skipping all deps (f27201b)
- themes: inject root colors, slider CSS, and webkitJS into webkit pages (b341752), closes #617 #694
- themes: inject stylesheets before to fix cascade order (86f2334), closes #210
- ttc: default baseUrl to tsconfig dir when not set (93251a5)
- ttc: Fix pathing issue (5c22bbf)
- ttc: Fix ttc cli shebang (dcbd5a0)
- types: correct ThemeEditor separator type and IsThemeInstalled return type (bfa1864)
- update metadata.json with new commit hash after plugin update (fb708f6)
- Updater: Fix updater installing to %steam%/millennium instead of %steam% (c2a7921)
- Updates Panel: Fix styling and remove debug state. (bc96812)
- updates: Correct expand caret direction on update cards (2fb7057)
- use paru for AUR dep resolution in CI (f8e62f7)
- virtfs: introduce MILLENNIUM_EMBED_ASSETS and extend to RelWithDebInfo in all relevant checks (ce25b0f)
- virtfs: treat RelWithDebInfo as Release for asset embedding (87227d9)
Features
- accent colour support for macOS (a169179)
- Add frontend -> webkit FFI support (f70e206)
- add Linux dev environment setup and teardown scripts (24e6532)
- add loading spinner to recheck for updates button (bdf76c8)
- add plugin config API with cross-context sync (ffb2bf0)
- add recheck for updates button to no-updates placeholder (e10cada)
- Add Sliders to theme config. closes #653 (a4a8667)
- Add testing suite to Millennium source code (1eb0ebb)
- Added check for updates button (a396bbc)
- backend: Add per-operation progress tracking for concurrent installs (857b2d1)
- bootstrap: add millennium_pvs64 pressure-vessel unruntime shim for CDP pipe FD forwarding through bwrap (5eb398d)
- bootstrap: Replace Legacy bootstrap app with wrapper + bootstrap and child-hook dylibs (211b25e)
- build lua sandbox as native 64-bit on Linux (d4015ac)
- build: integrate typescript build into cmake with incremental per-package targets (e75e5d6)
- cdp: give each plugin its own isolated CDP instance (ac2fd6e)
- cdp: route frontend CDP calls through C++ pipe binding (df6d564)
- config: add initializer_list overloads for get/set (95b0bf2)
- deps: Drop libgit2, themes no longer use git, Millennium version controls them manually (aa1ae1c)
- ffi: propagate lua call site as caller in ffi records (f62d1ae)
- Finally type FFI signatures between cxx and frontend. Added ffi() which will supersede callable() (783a186)
- frontend: add ffi() v2 API and enable strict TypeScript (39e303f)
- frontend: Route installer progress by operation ID (2bc6606)
- frontend: warn users about legacy non-lua plugins on startup (cdf620a)
- install.sh: Add support for --run-id which lets you install a Millennium build from a GitHub Actions run (8f8bbb2)
- linux: add runtime AUR/distro update script detection helpers (d28c18e)
- locales: add missing Russian and Ukrainian translation keys (2b16a53)
- locales: add missing Russian and Ukrainian translation keys (fee51b4)
- LTS: Remove deprecated Python support, officially moving Lua into LTS. (1ab6a6a)
- macOS: Add install_macos.sh with tier0_proxy (8f2144e)
- macOS: Add native window corner styling (8ec7f09)
- macOS: bootstrap reorganization, menu fixes, and shutdown stability (a6f2715)
- macOS: Enable native window styling in steam helper injection (22f4727)
- macOS: Wrapper app install via install_macos.sh (6091a20)
- migration: migrate legacy ext/ layout to millennium/ on startup (b20eef6)
- Millennium now sandboxes plugin backends, preventing them from crashing Millennium. (6929933)
- move HTTP from lua sandbox to parent process via RPC (297e6dc)
- Move Millennium installation to %LOCALAPPDATA%/Millennium on windows (5ffe4b0)
- plugins: add legacy plugin detection and superseded plugin modal (9f1a7bd)
- quickcss: add native file watcher with live reload (aa40ed1)
- remove unneeded dependencies: fmt, incbin, and vendored lua_cjson. fmt & incbin has been replaced with C++23 std::format and #embed. (c05144b)
- run test PKGBUILD before publishing to AUR (05a6d6b)
- scripts: Add Async-FFI macOS launch flow (1033f3b)
- settings: Restore settings page after JS context restart (8f522bc)
- src: Integrate Macos platform wiring in Cmake with menu hook and native dialogs (8932a97)
- ttc: add --watch and fix constSysfsExpr throwing a warning on compilation (f0ddeaf)
- ttc: use esbuild instead of typescript on dev builds, improving build speeds by 10x (703fd46)
- updates: Support parallel theme and plugin updates (f1dff4c)
Reverts
- remove %LOCALAPPDATA% migration, restore Steam directory layout (710f5f0)
- undo global frontend reload change (4881288)
BREAKING CHANGES
- plugins, themes, config, and binaries moved from /ext/ to /millennium/
What's Changed
- draft: initial setup of browser extension manager by @BossSloth in #636
- Add lines to target Korean localization by @FrostyNow in #659
- chore(deps): bump rollup from 4.50.1 to 4.59.0 in /src/sdk by @dependabot[bot] in #661
- Hungarian translation fix by @A41K in #666
- Feature/macOS support based on async-ffi branch by @iFleey in #664
- Add Spanish (Latin America) localization by @CrisPH7 in #668
- Fix grammar errors in sdk README by @Blagai in #690
- feat: allow passing --beta argument for installing beta prereleases by @CatPieLeaf in #693
- Patch support for clang till cpp20. by @ninetailedtori in #688
- Update nix package to v2.36.0 by @LucasOe in #724
- removing 'shallow=true' attributes from inputs url as it is irrelevant and breaking for lix by @Murazaki in #727
- Update italian.json by @MakinDay in #695
- add tchinese by @NikolaJyun in #702
- feat: add Dutch (dutch) localization by @MooseScripts in #729
- Next by @shdwmtr in #736
- chore(deps): bump rollup from 4.17.2 to 4.59.0 in /src/typescript/sdk/packages/loader by @dependabot[bot] in #737
- fix(nix): Fixed build bug with python venv by @cowburrs in #716
- remove shallow=true attributes from nix flake inputs by @scouckel in #738
- Next by @shdwmtr in #749
- fix(locales): evaluate settings tab titles at render time by @WkdXeqtr in #758
- Update Simplified Chinese localization by @yhdsl in #753
- feat(locales): add missing Russian and Ukrainian translation keys by @WkdXeqtr in #759
- fix(locales): evaluate settings tab titles at render time by @WkdXeqtr in #764
- feat(locales): add missing Russian and Ukrainian translation keys by @WkdXeqtr in #765
- Update Japanese translate by @reindex-ot in #763
- Next by @shdwmtr in #770
- Add Spanish translations by @devparada in #768
New Contributors
- @CrisPH7 made their first contribution in #668
- @Blagai made their first contribution in #690
- @CatPieLeaf made their first contribution in #693
- @LucasOe made their first contribution in #724
- @Murazaki made their first contribution in #727
- @NikolaJyun made their first contribution in #702
- @MooseScripts made their first contribution in #729
- @cowburrs made their first contribution in #716
- @scouckel made their first contribution in #738
- @WkdXeqtr made their first contribution in #758
- @yhdsl made their first contribution in #753
- @reindex-ot made their first contribution in #763
Full Changelog: v2.35.0...v3.0.0