<feed xmlns='http://www.w3.org/2005/Atom'>
<title>Fluorine-Manager.git/libs/uibase, branch main</title>
<subtitle>A port of MO2 in linux with NaK integration and FUSE based VFS. Comes with Root Builder support by default.</subtitle>
<id>http://git.schererleander.de/Fluorine-Manager.git/atom/libs/uibase?h=main</id>
<link rel='self' href='http://git.schererleander.de/Fluorine-Manager.git/atom/libs/uibase?h=main'/>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/'/>
<updated>2026-06-23T21:54:42Z</updated>
<entry>
<title>Add IPluginGame::usesVFS() game feature and python binding</title>
<updated>2026-06-23T21:54:42Z</updated>
<author>
<name>tristan-iu</name>
<email>tristan.iung@hotmail.com</email>
</author>
<published>2026-06-21T15:56:42Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=a5ad5ddc9df898cffad7e7a0996051a455fc99fc'/>
<id>urn:sha1:a5ad5ddc9df898cffad7e7a0996051a455fc99fc</id>
<content type='text'>
</content>
</entry>
<entry>
<title>mo2: catch up to upstream 2.5.3 Betas 3-11</title>
<updated>2026-05-17T00:51:40Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-05-17T00:51:40Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=549b84b0f8815737c93913b200dde3821a062cb0'/>
<id>urn:sha1:549b84b0f8815737c93913b200dde3821a062cb0</id>
<content type='text'>
Multi-area sync against the upstream MO2 2.5.3 beta line. Roughly three
logical sections share the diff:

Catch-up (Betas 3-11):
- nxmaccessmanager: drop "supporter" from validRoles so non-premium
  supporters get the right download path (Beta 10)
- mainwindow: disable tutorial triggers at the trigger sites; Qt 6.11
  lockup on child windows (Beta 4)
- basic_games: add Kingdom Come Deliverance 2, Slay the Spire 2
  (Betas 11, 6)
- uibase: add NXM collections parsing fields/accessors + (?:nxm|modl)
  scheme support in NXMUrl (Beta 9)
- Starfield: blueprintPrefix() on IPluginGame; plugins.txt write
  suppression for blueprint plugins; hasInvalidBlueprint /
  hasUnpairedBlueprint diagnoses; Title-keyed content catalog
  consolidation (Betas 3-5)
- downloadmanager + systemtraymanager + organizercore + iuserinterface
  + settings: add Beta 11 "show notifications when downloads complete
  or fail" toggle and the showNotification plumbing
- nxmaccessmanager: restore upstream re-entry guard for OAuth refresh
  and the styled OAuth response page (Beta 11)
- organizer_en.ts and game-bethesda *_en.ts: pull upstream HEAD strings

Workarounds tab removed:
- Delete settingsdialogworkarounds.{h,cpp}; drop the tab in
  settingsdialog.ui; move "Enable archives parsing" into General
- Hardcode GameSettings::forceEnableCoreFiles() to true so the
  primary-master toggle-off bug (DLCs unchecked on tab refresh) can't
  recur; setter becomes a no-op
- No-op stubs for offlineMode, useProxy, useCustomBrowser, Steam
  appID/credentials, executablesBlacklist, skipFileSuffixes,
  skipDirectories — UI gone, accessors keep call sites green
- settingsdialognexus drops the custom-browser wiring; spawn drops the
  "Change the blacklist" Retry path

Beta 9 download manager port:
- fileID-first match in nxmFilesAvailable and
  nxmFileInfoFromMd5Available; filename remains the fallback
- NexusInterface::isActiveFileStatus() helper; rewrite of
  nxmUpdatesAvailable to use pickNewestVersion /
  findUpdateChainSuccessors / resolveInstalledFileId. ARCHIVED_HIDDEN
  now correctly treated as inactive
- std::optional&lt;unsigned int&gt; reservedID on DownloadInfo factories and
  on the three addDownload overloads; startDownloadURLs and
  startDownloadURLWithMeta return the canonical DownloadID instead of
  m_ActiveDownloads.size()-1 (which was the index, not an ID)
- QHash&lt;unsigned int, DownloadInfo*&gt; m_ByID maintained alongside
  m_ActiveDownloads at every mutation site; downloadInfoByID is now
  O(1) via m_ByID.value(id, nullptr)

LOOT remains intentionally stripped (lootcli build cruft cleaned up
separately). BSA wide-path skipped — Linux UTF-8 paths already work.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>shell::Rename: report both rename + copy errors on fallback</title>
<updated>2026-05-01T15:45:37Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-05-01T15:45:37Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=a6a4bcc8fcd7cb928d4863d2887ab7e8d728f24c'/>
<id>urn:sha1:a6a4bcc8fcd7cb928d4863d2887ab7e8d728f24c</id>
<content type='text'>
Cherry-picked the two surviving improvements from stale branch
claude/fix-reported-issues-Iyt4s (issue #54). Rest of the branch's
content (Starfield data dir, My Games spam fix) was already
absorbed in main from a separate pass.

- Rename copy fallback: previously dropped the original rename
  errno and returned generic ERROR_ACCESS_DENIED with no
  context. Now bubbles "Rename failed: %1. Copy fallback failed: %2"
  with both QFile::errorString() values so the log line actually
  identifies what went wrong.
- formatSystemMessage: added an explicit comment block on why
  the codebase's Windows error macros (5=ACCESS_DENIED) must not
  be passed through strerror (5=EIO) on Linux.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Remove AppImage build target and runtime references</title>
<updated>2026-05-01T15:09:39Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-05-01T15:09:39Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=af43100e29859adbf5dcb6ee90cd8f981439b859'/>
<id>urn:sha1:af43100e29859adbf5dcb6ee90cd8f981439b859</id>
<content type='text'>
We ship via portable tarball directory + .bin self-extracting installer
only; the AppImage path was unmaintained and pulling in linuxdeploy
tooling for a format we no longer publish.

Build:
- build.sh: drop appimage/all-includes-appimage modes (now: tarball,
  installer, all=both, shell). Output listing tracks the directory.
- docker/Dockerfile: drop BUILD_APPIMAGE arg and the linuxdeploy
  download/extract block.
- docker/build-inner.sh: drop build_appimage() (~120 lines), AppImage
  arm of the BUILD_MODE switch, *.AppImage summary listing.
- docker/AppRun.sh: deleted.
- .gitignore: drop *.AppImage / squashfs-root / *.flatpak entries.

Runtime: no longer key off APPIMAGE/APPDIR env vars or AppRun-set
state. The fluorine-manager launcher script already exports
FLUORINE_ORIG_*, MO2_BASE_DIR, MO2_PLUGINS_DIR, MO2_LIBS_DIR,
MO2_PYTHON_DIR for the same purpose, so simplify:
- envshortcut: appImageOrBinary -&gt; launcherOrBinary; bundledFluorineIcon
  no longer probes APPDIR.
- nxmhandler: drop APPIMAGE-based wrapper path; use applicationFilePath.
- protonlauncher: rename cleanAppImageEnv -&gt; cleanFluorineEnv, drop
  APPIMAGE/APPDIR/OWD/ARGV0/APPIMAGE_ORIGINAL_EXEC/DESKTOPINTEGRATION
  removals and .mount_Fluori pattern strip.
- prefixsetuprunner: same env-cleaning trim.
- utility, library.h, proxypython, mainwindow, moapplication, appconfig:
  comment cleanup pointing at the launcher instead of AppRun.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Detect native-Linux Stardew Valley, default executables to no-Proton</title>
<updated>2026-04-26T01:27:53Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-04-26T01:27:53Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=d06dd9bf82040ad67a6f12fb92fb411770d63f28'/>
<id>urn:sha1:d06dd9bf82040ad67a6f12fb92fb411770d63f28</id>
<content type='text'>
Add IPluginGame::isNativeLinux() (virtual, default false) so a plugin
can advertise that the discovered installation is a native Linux build.
Bound through the Python plugin trampoline so basic_games subclasses can
override it.

Stardew Valley plugin: when the install dir contains the StardewValley
launcher script and no Stardew Valley.exe, report isNativeLinux=true and
return Linux-side binary names (StardewValley, StardewModdingAPI). Also
fix GameDataPath to "Mods" — Linux ships the SMAPI mods dir with a
capital M.

ExecutablesList::getPluginExecutables: skip the UseProton flag when the
plugin reports native Linux, so the spawn path falls into launchDirect()
and the game runs without a Wine prefix.
</content>
</entry>
<entry>
<title>Fix VFS rmdir, prefix/launch issues, add version + beta channel</title>
<updated>2026-04-23T21:09:59Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-04-23T21:09:59Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=96a6ba196c72e955c3db822d93da38fce8cd7045'/>
<id>urn:sha1:96a6ba196c72e955c3db822d93da38fce8cd7045</id>
<content type='text'>
- VFS: add mo2_rmdir + OverwriteManager::removeDirectory so Wrye Bash
  shutil.rmtree stops failing with WinError 267 (issue #47).
- FileRenamer: case-insensitive fallback via new resolvePathCaseInsensitive
  walks each path component; bulk hide in Conflict tab no longer dies with
  a misleading "Input/output error" when DirectoryEntry normalised parent
  dir case (issue #54). formatSystemMessage stops aliasing Windows error
  code 5 to errno 5 (EIO).
- Versioning: FLUORINE_VERSION_* + fluorine_build_info.h generated from
  CMake; Linux createVersionInfo returns Fluorine's version. About dialog
  shows Fluorine version + MO2 engine + commit. Beta builds stamp
  "&lt;semver&gt;B&lt;yyyymmddhhmm&gt;" (issue #51).
- CI: ci.yml determines channel from ref (v* tags = stable, main = beta),
  publishes a rolling `beta` GitHub release whose body carries a
  machine-parseable fluorine-meta block (timestamp, commit) for the
  in-app updater.
- Updater: new FluorineUpdater polls GitHub API on startup, compares
  against embedded metadata, notifies on new release without auto-install.
  Channel toggle piggybacks on the existing "beta versions" checkbox.
- Bethesda plugins: determineMyGamesPath no longer creates
  Documents/My Games/&lt;GameName&gt; for every possible title at plugin load;
  only games with a detected install path get their dirs created
  (issue #55).
- Starfield: dataDirectory() on Linux now points at &lt;game&gt;/Data instead
  of My Games/Starfield/Data so the single FUSE mount lands where SFSE
  loads plugins; My Games Data becomes a secondary symlinked mapping
  (issue #56).
- Prefix resolution: prefer Fluorine config, then explicit
  fluorine/prefix_path, then legacy Settings/* keys (with a warning) so
  auto-detected Heroic/Bottles prefixes can't silently override a user-
  configured Fluorine prefix (issue #52). compatDataPathFromPrefix no
  longer hands Proton the wrong parent dir for plain wine prefixes.
- xrandr: ensureXrandrInstalled back-fills the helper for existing SLR
  installs, prefix init runs it before wineboot, SLR wrap exposes
  xrandr-bin via --filesystem= and prepends PATH inside the container
  (issue #49).
- Process tracking: drop the wineserver-as-last-resort fallback that made
  MO2 hang on Proton's session manager after game exit. Rescan the prefix
  for matching game executables instead (covers reparented launcher
  children like f4se_loader → Fallout4.exe). Unlock button now kills
  wineserver for the prefix (SIGTERM then SIGKILL on timeout).

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Symlink saves, rank prefixes by Steam app type, ntsync safeguards</title>
<updated>2026-04-17T05:53:20Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-04-17T05:53:20Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=06c396fd27f55929b40161e587cb9b596b549f3f'/>
<id>urn:sha1:06c396fd27f55929b40161e587cb9b596b549f3f</id>
<content type='text'>
- Replace copy-in/copy-out save deployment with a direct symlink from the
  prefix's __MO_Saves to the profile's saves/. Writes land in the profile
  immediately; afterRun reverts the symlink + prefix INI so a vanilla
  launch outside MO2 uses the default Saves dir.
- Parse Steam's binary appinfo.vdf (v41) via a new Rust FFI crate backed
  by steam-vdf-parser. Rank detected games by common.type so real Games
  beat Tools/Editors when multiple prefixes share a My Games folder name
  (fixes Creation Kit shadowing Skyrim SE). Top-ranked candidate
  overwrites stale symlinks from earlier runs.
- Switch bundled Steam Linux Runtime downloader from sniper (steamrt3)
  to steamrt4 so Proton 11+ works out of the box. steamrt4 omits xrandr
  so we inject it from the Debian x11-xserver-utils .deb into a
  dedicated dir and prepend it to PATH via `env PATH=...` inside the
  pressure-vessel container (PATH env doesn't propagate).
- Auto-kill stale wineboot/wineserver/pv-adverb processes still bound
  to the prefix before starting a new wineboot -u; match by
  /proc/&lt;pid&gt;/environ WINEPREFIX / STEAM_COMPAT_DATA_PATH since Wine
  cmdlines are Windows-style. Same sweep runs in destroyPrefix so a
  delete actually frees file handles.
- Blacklist Proton 11 (Steam-bundled) — its current Wine tree deadlocks
  during wineboot -u on modern kernels via ntsync / futex_wait_multiple
  races. Use "waitforexitandrun" (not "run") for prefix init so
  use_sessions=1 Protons don't fork into a persistent session manager.
- Drop WINEDEBUG=-all during prefix init so wineboot progress is
  visible. Suppress focus-stealing by setting WA_ShowWithoutActivating
  on the PrefixSetupDialog and SLR download progress dialogs.

Co-Authored-By: Claude Opus 4.7 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add BSA in-memory extraction and nested preview support</title>
<updated>2026-04-12T22:55:56Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-04-12T22:55:56Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=892070f3dec1dc690983fd862880e37e711c2516'/>
<id>urn:sha1:892070f3dec1dc690983fd862880e37e711c2516</id>
<content type='text'>
bsatk:
- Archive::extractToMemory() extracts a file directly into a byte buffer
  instead of a filesystem path, backed by a std::ostringstream sink.
- Archive::findFile() locates a file by relative path, case-insensitive
  and separator-agnostic, walking the folder tree recursively.
- extractDirect/extractCompressed now take std::ostream&amp; so both the
  ofstream and ostringstream paths share the same implementation.

libbsarch: shim rewrite on Linux to map the Windows API surface onto
bsatk::Archive, enabling preview_bsa to open vanilla BSAs via the
same interface as other plugins.

preview_bsa: double-click on a file in the BSA tree now extracts the
bytes via extractToMemory() and hands them to IOrganizer::previewFileData
for nested preview rendering (e.g. NIF inside a BSA).

uibase + organizerproxy + organizercore: new IOrganizer::previewFileData
virtual that routes in-memory file bytes through the first registered
IPluginPreview matching the extension. Uses heap + WA_DeleteOnClose +
open() to avoid nested exec() softlock from mod info filetree -&gt;
preview_bsa tree -&gt; nif preview.

docker/build-inner.sh: stage preview_nif shaders into plugin_data/shaders
so ShaderManager can load them via IOrganizer::getPluginDataPath().

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix backup restore failing when destination file already exists</title>
<updated>2026-04-10T09:18:14Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-04-10T09:18:14Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=0b726b03d0d5c018004af438c8080f8d5ea7d432'/>
<id>urn:sha1:0b726b03d0d5c018004af438c8080f8d5ea7d432</id>
<content type='text'>
QFile::copy() does not overwrite existing files, unlike Windows
SHFileOperation. Remove destination before copying to match the
expected overwrite behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Remove NaK/Rust dependency, port remaining functionality to native C++</title>
<updated>2026-04-08T08:30:04Z</updated>
<author>
<name>SulfurNitride</name>
<email>SulfurNitride@users.noreply.github.com</email>
</author>
<published>2026-04-08T08:30:04Z</published>
<link rel='alternate' type='text/html' href='http://git.schererleander.de/Fluorine-Manager.git/commit/?id=3de4056df4ea5d0afbcea388ad8d681daea1aac3'/>
<id>urn:sha1:3de4056df4ea5d0afbcea388ad8d681daea1aac3</id>
<content type='text'>
Replace NaK Rust crate and nak_ffi with native C++ implementations:
- Game detection (Steam, Heroic, Bottles), VDF parser, icon extraction
- Prefix symlinks, SLR manager, Steam path detection
- Known games database

Add FUSE VFS optimizations: zero-copy reads via fuse_reply_data,
default_permissions mount option, FUSE_CAP_ASYNC_DIO, FUSE_CAP_EXPIRE_ONLY,
lookup cache parent index, cached mode bits, increased I/O buffer sizes.

Update build system, prefix setup, and various fixes.

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
