aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* Fix LOOT launch: clean QT_PLUGIN_PATH and LD_LIBRARY_PATH from envSulfurNitride2026-03-111-2/+11
| | | | | | | | LOOT's AppImage bundles its own Qt — inheriting Fluorine's QT_PLUGIN_PATH caused incompatible Qt plugin loading (exit code 6). Also clean LD_LIBRARY_PATH when the original was empty. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix RPATH patching for .so.* files (libproxy.so.1, libpxbackend)SulfurNitride2026-03-111-1/+1
| | | | | | | The find glob only matched *.so, missing versioned shared libraries like libproxy.so.1 which retained hardcoded Docker build paths. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix FUSE passthrough: use proper API, drop LD_LIBRARY_PATH, auto-apply capSulfurNitride2026-03-116-50/+101
| | | | | | | | | | | | | | | | - Use fuse_passthrough_open/close API instead of raw fd assignment to fi->backing_id, which caused EIO on every file open through the VFS - Remove LD_LIBRARY_PATH from launcher script — DT_RPATH handles lib resolution, and LD_LIBRARY_PATH triggers AT_SECURE which drops file capabilities (cap_sys_admin) needed for passthrough - Auto-detect missing cap_sys_admin at mount time and prompt via pkexec to re-apply it (handles binary copy/update/extract losing the cap) - Disable passthrough for session if fuse_passthrough_open fails, avoiding "Operation not permitted" spam in terminal - Fix Nix flake: tinyxml2 → tinyxml-2, xorg.lib* → top-level names - CI: eliminate artifact zip round-trip for GitHub releases Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix flake.nix: escape bash ${var} in Nix '' stringsSulfurNitride2026-03-111-26/+26
| | | | | | | Nix interprets ${...} inside '' strings as its own interpolation. Use ''${...} to emit literal ${...} in the generated launcher script. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Sync entire app to ~/.local/share/fluorine/bin/ for stable symlinksSulfurNitride2026-03-112-45/+52
| | | | | | | | | The launcher now deploys the full application (not just Python) to the central data directory on launch. Instance plugin symlinks always point to this stable location instead of the tarball extraction dir, so they survive moves/deletes of the original archive. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* CI: build tarball instead of AppImage, publish .tar.gz in releasesSulfurNitride2026-03-111-17/+8
| | | | Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* FUSE VFS performance, tracked writes fix, remove steam-run, add NixOS flakeSulfurNitride2026-03-1118-256/+1165
| | | | | | | | | | | | | - FUSE: disable AUTO_INVAL_DATA, enable readdirplus, 24h TTLs, clone_fd, FUSE_USE_VERSION=312 — cuts game load time from 2:40 to 1:57 - Fix tracked writes going to wrong (lower-priority) mod in both detectManualMoves and syncOverwrite - Remove steam-run entirely (UI, C++, Rust layers) - Build system: default to tarball, add installer/appimage as opt-in modes - Add flake.nix for NixOS — builds from source with Rust crates as separate pure derivations, FHS wrapper, NixOS module with FUSE passthrough Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Track files moved from Overwrite to mods for in-place write-backSulfurNitride2026-03-1010-21/+769
| | | | | | | | | | When users move generated files (logs, INIs) from Overwrite into a dedicated mod folder, future VFS writes to those files now go directly to the mod instead of creating duplicates in Overwrite. Tracking persists across sessions via a JSON file and detects manual moves by comparing overwrite snapshots between sessions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove COW from FUSE VFS — write mod files in-placeSulfurNitride2026-03-092-106/+8
| | | | | | | | Mod .ini/.log files now stay in their original mod folder instead of being copied to Overwrite. All files pass through reads and writes to their real location. No copy-on-write needed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* FUSE VFS: lazy copy-on-write to prevent Overwrite folder pollutionSulfurNitride2026-03-092-24/+74
| | | | | | | | Defer COW from open() to first write(). Wine/Proton opens mod files O_RDWR for metadata ops (SetFileTime, etc.) without actually writing, which was copying SKSE plugin .ini/.log files into Overwrite needlessly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Extract icons from .exe files for desktop shortcuts, add cache invalidationSulfurNitride2026-03-081-26/+295
| | | | | | | | | Parse PE resources to extract the largest embedded icon from Windows executables and save as PNG to ~/.local/share/icons/fluorine/. If a cached icon is just the Fluorine fallback (same file size), re-attempt extraction in case the executable changed or was previously unavailable. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix LOOT sort for PluginsTxt games, improve desktop shortcuts, add Browse VFSSulfurNitride2026-03-087-25/+201
| | | | | | | | | | | | | | | | | | | LOOT sort fix: For PluginsTxt games (FO4, SkyrimSE), LOOT only modifies plugins.txt, not loadorder.txt. Previously the stale loadorder.txt was copied back, causing readPluginLists() to use the old order. Now we regenerate loadorder.txt from the sorted plugins.txt. Desktop shortcuts: Add "Application Launcher" option on Linux that creates .desktop entries in ~/.local/share/applications/. Include instance name in both filename (New-Vegas-NVSE.desktop) and Name= field (NVSE (New Vegas)) to avoid collisions. Icons saved to ~/.local/share/icons/fluorine/ with game-specific names. Browse VFS: Add button in Data tab that mounts the FUSE VFS and opens the game Data folder in the system file manager, allowing users to browse the merged mod files as the game sees them. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove FUSE passthrough (CAP_SYS_ADMIN incompatible with AppImage), remove ↵SulfurNitride2026-03-086-19/+21
| | | | | | | | | | | bsplugins, fix bsatk types - Remove FUSE passthrough code: requesting FUSE_CAP_PASSTHROUGH without CAP_SYS_ADMIN caused session cleanup crash on shutdown - Remove bsplugins library (unneeded port) - Fix bsatk: use uint32_t instead of unsigned long for BSAULong (LP64 compat) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* FUSE VFS performance: attr cache, selective invalidation, init tuningSulfurNitride2026-03-086-89/+1066
| | | | | | | | | | | | - Increase ATTR_CACHE_SECONDS from 1.0s to 30.0s (90% getattr reduction) - Replace nuclear clearDirCache() with selective invalidateDirCache() that only clears the affected parent directory instead of all caches - Add mo2_init callback: enable FUSE_CAP_AUTO_INVAL_DATA for kernel page cache retention across open/close, increase max_readahead/max_write to 1MB - Switch open_files_mutex to shared_mutex for concurrent read access - Add perf handoff doc for VFS optimization history Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix LOOT sort copy-back, add Linux desktop shortcuts, remove Start MenuSulfurNitride2026-03-075-35/+182
| | | | | | | | | | | | | | | | | - Fix LOOT sorted order not applying: prefer Plugins.txt (capital P) over our pre-deployed plugins.txt (lowercase) since LOOT writes capital P on Linux case-sensitive FS. Same for Loadorder.txt. - Force plugin list refresh after LOOT sort (refreshESPList(true)) - Remove Start Menu shortcut option on Linux (no-op, Windows-only concept) - Implement .desktop file creation for Desktop shortcuts on Linux: - Use $APPIMAGE env var for stable executable path (not ephemeral mount) - Quote paths with spaces in Exec line - Use absolute instance directory path for portable instances - Install Fluorine icon to ~/.local/share/icons/ for persistence - Skip .exe icons (can't render on Linux) - Fix moshortcut:// instance matching for portable instances using abs paths Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix LOOT integration: FileTime support, VFS timestamps, perf, and overwrite ↵SulfurNitride2026-03-077-38/+323
| | | | | | | | | | | | | | | | pollution - Fix VFS files/dirs showing 1969 dates (separate error codes for mtime, set dir timestamps) - Add stampPluginTimestamps() for FileTime games (FalloutNV/FO3/Oblivion) so LOOT sees correct load order - Fix LOOT masterlist URL (v0.21 → v0.26) and point local_path to Fluorine prefix AppData - Capture FileTime-based load order from VFS timestamps before unmount - Handle Plugins.txt case sensitivity on Linux (LOOT writes capital P) - Skip loadorder.txt copy-back for FileTime games to preserve sorted order - Prevent LOOT COW'd plugins from polluting overwrite (discardStagingOnUnmount flag) - Update mo2_setattr to modify VFS tree mtime in-place without triggering COW - VFS perf: replace fs::relative() with fast string prefix strip, cache clock offset, parallel mod scanning Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Replace lootcli with standalone LOOT GUI AppImage on LinuxSulfurNitride2026-03-0715-24/+730
| | | | | | | | | | | | | | | - Download LOOT AppImage from GitHub releases on first sort - Pre-seed LOOT settings.toml with game type, path, and masterlist URL - Mount FUSE VFS before launching LOOT, unmount after exit - Copy plugins.txt/loadorder.txt to LOOT local path and back - Fix VFS file timestamps (separate error_code for mtime) - Add directory timestamps to FUSE (was showing 1969) - Stamp plugin files with load-order-based incrementing timestamps - Remove WebEngine dependency on Linux (QTextBrowser fallback) - Enable LOOT sorting for FalloutNV and FalloutTTW - Add unmountVFS() to OrganizerCore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Merge pull request #33 from RevengeRip/mainSulfurNitride2026-03-061-5/+5
|\ | | | | Make overwrites the highest priority
| * Make overwrites the highest priorityOleg2026-03-071-5/+5
|/ | | | | | Overwrites were loading just after base files before mods themselves, meaning mods will overwrite everything in overwrites (which contradicts purpose of overwrites folder).
* Use direct stderr for VFS timing logs and filter Wine/Proton noiseSulfurNitride2026-03-053-16/+39
| | | | | | | | | - Switch VFS timing logs from log::info() to fprintf(stderr) so they always appear in terminal regardless of configured log level - Filter noisy Wine/Proton stderr output (GStreamer warnings, ProtonFixes info, RADV conformance, MangoHud, NTSync messages) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add VFS deploy and mount timing logsSulfurNitride2026-03-022-12/+63
| | | | | | | | | | | | | | Log timing for each phase of VFS setup and teardown at info level: - Base game file scan (fresh vs cached) - VFS tree build (file/dir counts) - External mapping deployment (symlink/file counts) - FUSE mount (total) - Staging flush on unmount - Full unmount - updateMapping total - Post-run permission restore Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Restore game directory permissions after each runSulfurNitride2026-03-021-0/+17
| | | | | | | | In rare cases (crashes, unclean Wine shutdown), game files can end up read-only. As a precaution, restore owner rwx permissions on all files in the game directory after every run, right after FUSE unmount. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix VFS staging permissions and createTarget routingSulfurNitride2026-03-022-14/+35
| | | | | | | | | | | | | | | | | Two fixes: 1. copyOnWrite() preserves source file permissions via fs::copy_file(). If the source was read-only (Steam game files, Windows mod archives), the staging copy was also read-only, causing writes to fail with EACCES. Now adds owner_write permission after copying. 2. createTarget from the saves mapping (which targets __MO_Saves in My Games, not the Data dir) was incorrectly setting m_customOutputDir, causing ALL VFS staging files to flush to the profile saves directory instead of overwrite. Now only data-dir mappings can set the custom output directory. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix wineserver tracking matching unrelated wine prefixesSulfurNitride2026-03-011-11/+57
| | | | | | | | | | | | | findWineserver() was scanning /proc for ANY wineserver owned by the current user. If the user had other wine processes running (e.g. winecfg under ~/.wine), Fluorine would latch onto that unrelated wineserver and never declare the game finished. Now reads WINEPREFIX from the launched process's /proc/<pid>/environ and passes it to findWineserver(), which filters candidates by matching their WINEPREFIX against the game's prefix path. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix saves tab showing profile-specific saves when feature is disabledSulfurNitride2026-02-281-1/+1
| | | | | | | | When local saves is off but the game INI still has a stale sLocalSavePath=__MO_Saves\, ignore it and fall back to the default saves directory instead of following the redirect. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix modlist column visibility not persisting across relaunchesSulfurNitride2026-02-271-1/+6
| | | | | | | | | | The restoreState() method restored the header state (column visibility) before restoring the groupBy combo index. Changing the groupBy triggers updateGroupByProxy() which swaps the sort proxy's source model, resetting the header and showing all columns. Fix by restoring groupBy first so the model chain is stable when header state is applied. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix SVG icons and checkboxes: bundle qt6-svg-pluginsSulfurNitride2026-02-2711-0/+127
| | | | | | | | | | The AppImage was missing libqsvg.so (Qt SVG imageformat plugin), causing SVG-based theme icons and checkboxes to render as blank squares. Add qt6-svg-dev and qt6-svg-plugins to the Docker image. Also add explicit unchecked checkbox images to all vs15 Dark themes for consistent rendering on Linux. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix DownloadManager::stateChanged signal connectionSulfurNitride2026-02-271-1/+1
| | | | | | | | | The old-style SIGNAL() macro had the wrong signature: stateChanged(int,int) instead of stateChanged(int,DownloadManager::DownloadState). This caused Qt to silently fail the connection, meaning the download list view never updated when download state changed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix NXM handler: use absolute path in desktop file Exec lineSulfurNitride2026-02-271-1/+3
| | | | | | | | | | | The desktop file used a bare command name (mo2-nxm-handler) which relies on ~/.local/bin being in PATH. When the browser or desktop environment invokes the URL scheme handler, ~/.local/bin is often not in PATH, so the handler silently fails. Use the full absolute path to the wrapper script instead. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix NXM handler for AppImage: use stable executable pathSulfurNitride2026-02-271-1/+10
| | | | | | | | | | | | | | | The NXM handler wrapper script was using QCoreApplication::applicationFilePath() which returns the temporary FUSE mount path for AppImages (/tmp/.mount_FluoriXXXXXX/...). This path changes every launch and doesn't exist when the AppImage isn't running, breaking NXM downloads from Nexus. Now uses the APPIMAGE env var (the actual .AppImage file path on disk) which is stable across launches and always accessible. Fixes #20 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix process tracking for Wine/Proton game processesSulfurNitride2026-02-272-11/+72
| | | | | | | | | | | | | | | | | | | Process tracking failed with Proton-GE because launcher executables (nvse_loader.exe, skse_loader.exe) exit after spawning the actual game (FalloutNV.exe, SkyrimSE.exe). The tracker saw the launcher exit and declared the game done, unmounting VFS while the game was still running. Fix: when the tracked process exits, fall back to waiting for wineserver which stays alive as long as ANY wine process in the prefix is running. This is the most robust way to detect when a game has truly exited, regardless of how many launcher layers are involved. Also: - Use "waitforexitandrun" proton verb instead of "run" (matches umu) - Reduce process tracking log spam (log once on first find, not every 50ms poll cycle) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix log copy truncation, enable ccache for build cacheSulfurNitride2026-02-254-5/+34
| | | | | | | | | | | | | | | Fix "Copy all" log truncation: the code unconditionally stripped 2 chars (\r\n) from formatted log messages, but on Linux spdlog only appends \n. Every log message lost its last real character. Now strips trailing \r and \n dynamically. Enable ccache: it was installed in the Docker image but never activated. build-inner.sh now auto-detects ccache and sets CMAKE_*_COMPILER_LAUNCHER. build.sh mounts a persistent ccache volume (~/.cache/fluorine-ccache) into the container. CI workflow uses actions/cache to persist ccache across runs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix process tracking for Wine/Proton game processesSulfurNitride2026-02-251-7/+61
| | | | | | | | | | | | | | | | | | findTrackedProcess was only checking /proc/<pid>/comm to match game executables. This fails for Wine/Proton because: 1. /proc/comm is truncated to 15 chars (TASK_COMM_LEN), so "FalloutNVLauncher.exe" becomes "FalloutNVLaunch" — no match 2. Wine processes show "wine64-preloader" or "start.exe" in comm, not the actual game executable name 3. With UMU_ID set, Proton-GE launches via "start.exe /unix <game>" adding another indirection layer Now also checks /proc/<pid>/cmdline which contains the full untruncated command line including the game .exe path. Handles both Windows-style backslash paths (c:\...\game.exe) and Unix paths. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix non-Steam game launch: skip steam bridge, fix process trackingSulfurNitride2026-02-252-8/+43
| | | | | | | | | | | | | | Set UMU_ID=fluorine when Steam DRM is disabled so Proton-GE launches the game directly instead of through steam.exe (which asserts for non-Steam executables like GOG games). Fix VFS premature shutdown by tracking the game PID across process reparenting. When the proton root process exits, wine/game processes get reparented to PID 1 and disappear from the descendant tree. Now we remember the tracked game PID and poll it directly, keeping VFS mounted until the actual game exits. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove umu-run, keep game as child process for Steam trackingSulfurNitride2026-02-2320-398/+216
| | | | | | | | | | | | | | | - Remove umu-run entirely (crashed due to pressure-vessel/FUSE incompatibility) — use raw `proton run` instead - Replace startDetached() with QProcess::start() so the game stays in Fluorine's process tree. This lets Steam track the game lifetime and makes the "close game" button work when Fluorine is added as a non-Steam game. - Add writeIniValueDirect/readIniValueDirect for safe Bethesda INI handling without QSettings corruption - Fix prefix_setup.rs to skip umu-run bootstrapping - Clean up settings UI, build scripts, and docs for umu-run removal Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix CI: use Docker build like build.sh, fix GHCR uppercase tagSulfurNitride2026-02-233-149/+61
| | | | | | | | | | The CI was failing because ghcr.io/SulfurNitride/fluorine-builder had uppercase letters (GHCR requires lowercase). Instead of depending on a pre-built GHCR image, CI now builds the Docker image from the Dockerfile each run (matching build.sh), with registry-based layer caching for speed. Also removes the duplicated inline AppImage logic in favor of build-inner.sh. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix AppImage plugin loading, save timestamps, and INI corruptionSulfurNitride2026-02-2020-1336/+1804
| | | | | | | | | | | | | | | | | | - Add AppConfig::pluginsPath()/dllsPath() that respect MO2_PLUGINS_DIR and MO2_DLLS_DIR env vars, fixing plugin discovery when plugins live inside read-only AppImage squashfs (#22, game plugin not found errors) - Preserve file modification times in save deploy/sync so games display correct save timestamps instead of all showing the same time (#17) - Replace QSettings INI reader in saves tab with direct line-by-line parser to avoid backslash-as-line-continuation corruption of sLocalSavePath=__MO_Saves\ (#22, saves tab showing wrong directory) - Add diagnostic logging to plugin symlink creation, save backup/restore operations to help diagnose silent failures through prefix symlinks - Fix Python SONAME mismatch in AppImage build (patch portable Python SONAME to match librunner.so DT_NEEDED, preventing dual libpython load) - Bundle PyQt6 Qt dependencies, improve RPATH for lib/ and plugins/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Python init diagnostics, AppImage build system, misc Linux fixesSulfurNitride2026-02-1962-2411/+1108
| | | | | | | | | | | | | | | | | | | | - python: switch Py_InitializeEx → Py_InitializeFromConfig for explicit error reporting; add dladdr + fprintf diagnostics to trace which DSO Python symbols resolve to and whether Py_IsInitialized succeeds - python: log RTLD_NOLOAD vs fresh-load outcome when promoting libpython to RTLD_GLOBAL - build: add Docker-based AppImage build script (build.sh), update Dockerfile and build-inner.sh for AppImage-only workflow - build: remove Flatpak support entirely; move AppImage metadata (desktop/metainfo/icon) from flatpak/ to data/ - Add Monster Hunter Wilds basic_games plugin - .gitignore: exclude squashfs-root, build-source, flatpak-repo, __pycache__, fomod-plus-settings.ini - Various Linux port fixes across wineprefix, processrunner, proton launcher, FUSE connector, instance manager, download manager, sanitychecks, and NaK Rust paths/runtime_wrap Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix fomod-plus image loading and settings file location on LinuxSulfurNitride2026-02-182-5/+10
| | | | | | | | | | Normalize Windows backslashes in fomod image paths so images like "fomod\MCM.png" resolve correctly on Linux. Move fomod-plus-settings.ini from QDir::currentPath() (home directory) to QStandardPaths::AppConfigLocation (Flatpak sandbox config dir). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Read Fluorine prefix path from config.json instead of QSettingsSulfurNitride2026-02-181-5/+20
| | | | | | | | Replace QSettings().value("fluorine/prefix_path") with a helper that reads fluorine/config.json directly, matching how the rest of the app resolves the prefix path. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix save deploy/sync for non-Bethesda games using Saved Games directorySulfurNitride2026-02-184-102/+146
| | | | | | | | | | | | | | | | | Games like Cyberpunk 2077 store saves in %USERPROFILE%/Saved Games/ instead of Documents/My Games/.../Saves. The save pipeline previously hardcoded Documents/My Games as the base path, so profile-specific saves never reached the correct location. Replace relative save path resolution with absolute path resolution that extracts the user-relative portion from LocalSavegames::mappings() or savesDirectory() and reconstructs it under the Fluorine prefix. Update restoreStaleBackups to scan the entire prefix for backup dirs. Remove "Saved Games" from NaK symlink skip list. Fixes #17 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Log Wine prefix plugin/INI paths at startup, fix noisy mergeTweak warningSulfurNitride2026-02-182-1/+15
| | | | | | | | | | - Log the resolved AppData/Local plugins dir and Documents/My Games INI dir at launch so users can verify correct paths in the terminal - Downgrade mergeTweak warning for missing profile_tweaks.ini to debug level since this file is optional and only exists if the user creates profile-level INI tweaks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix Wine prefix deployment, INI handling, and data directory pathsSulfurNitride2026-02-1773-391/+1458
| | | | | | | | | | | | | | | | | | | | - Fix data directory path to use ~/.var/app/com.fluorine.manager consistently (was ~/.local/share/fluorine in committed code) - Fix VFS helper path in fuseconnector.cpp to use fluorineDataDir() - Fix localAppFolder() to resolve Wine prefix AppData/Local on Linux instead of returning XDG ~/.local/share - Add localAppName() virtual method for correct AppData folder mapping (Enderal→"enderal", Nehrim→"Oblivion") - Fix mergeTweak() to use direct INI parser instead of QSettings which corrupts backslashes and URL-encodes spaces in keys - Make resolveWineDataDirName() more robust with existence checks and fallback chain (documentsDirectory → gameShortName → gameName) - Add comprehensive debug logging throughout Wine prefix deployment - Fix INI case handling: copy instead of symlink for case-mismatched INIs, ensure both proper-case and lowercase aliases exist - Remove native build script (Flatpak only) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update README to remove native build instructionsSulfurNitride2026-02-171-33/+1
| | | Removed sections about native builds and their requirements from the README.
* Fix FUSE VFS reporting wrong timestamps on save filesSulfurNitride2026-02-161-2/+41
| | | | | | | | | | | | | | | Three issues caused all save files to show the same date (the session start time), breaking Starfield's "Continue" mechanism: 1. setattr ignored FUSE_SET_ATTR_MTIME — Wine's SetFileTime() calls (utimensat) were silently dropped, so games couldn't set timestamps 2. TTL_SECONDS was 365 days — kernel cached stale attrs and never re-queried FUSE even after writes updated the real file 3. mo2_rename replaced mtime with now() instead of preserving it Fixes #16 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Clarify native build support in READMESulfurNitride2026-02-151-0/+2
| | | Added a note regarding the support status of native builds.
* Replace Python build deps with uv across all build pathsSulfurNitride2026-02-157-90/+85
| | | | | | | | | | | | | | | | | Use uv as the single Python package manager for Docker, source, and Flatpak builds. Python 3.13 and pybind11==2.13.6 are now consistent across all three paths. - Docker: install uv + build venv instead of python3-dev/pip/pybind11-dev - CMake: bootstrap pyvenv with uv (REQUIRED/FATAL_ERROR) when no explicit Python provided; pin pybind11==2.13.6, add sip - Flatpak: remove pybind11 cmake module, use uv pip install --target for build deps, uv for portable Python packages - build-inner.sh: use BUILD_PY throughout, uv pip install for portable runtime packages, simplify embed check to direct Python invocation - VFS helper: fall back to shared libfuse3 when static .a unavailable Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Bootstrap Python venv with uv when system packages are missingSulfurNitride2026-02-151-5/+38
| | | | | | | | | If python3-dev/pybind11-dev aren't installed and uv is available, automatically create a local venv at build/pyvenv/ with Python 3.13 and pybind11. Also detects pybind11 cmake dir dynamically instead of hardcoding the Python version in the path. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix system umu-run detection finding bundled copy insteadSulfurNitride2026-02-151-3/+19
| | | | | | | | | The launcher script prepends the app directory to PATH, so QStandardPaths::findExecutable found the bundled umu-run as the "system" one. Now explicitly filters out the app directory when searching PATH for a true system-installed umu-run. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Merge pull request #11 from RevengeRip/mainSulfurNitride2026-02-152-2/+7
|\ | | | | Thanks! Standard fix for Wayland icon association.