A comprehensive guide to running NMSE (No Man's Save Editor) on Linux using Wine.
Note: This is an interim solution. A native cross-platform version using Eto.Forms is planned - see the Cross-Platform Work Plan for details.
- Overview
- Prerequisites
- Option A: Quick Start with Launch Script
- Option B: AppImage (Self-Contained)
- Option C: Bottles GUI
- Finding Your NMS Save Files
- Wine Compatibility Notes
- Troubleshooting
- Building from Source for Wine
- Known Limitations
NMSE is a .NET 10 WinForms application built for Windows. On Linux, it runs via Wine - a compatibility layer that translates Windows API calls to Linux equivalents.
Why does it work well?
- NMSE uses only standard WinForms controls (no DirectX, no COM, no P/Invoke)
- The .NET runtime is bundled in the self-contained publish (Wine doesn't need .NET installed)
- GDI+ rendering (used for the inventory grid) is well-supported in Wine via FreeType
- All file I/O uses managed .NET APIs, not raw Win32 calls
Three ways to run NMSE on Linux:
| Method | Setup Difficulty | Self-Contained | Best For |
|---|---|---|---|
| Launch Script | Easy (needs Wine installed) | No | Users who already have Wine |
| AppImage | Easiest (just download + run) | Yes (bundles Wine) | Most users |
| Bottles | Easy (GUI) | No | Users who prefer a Wine GUI |
- Architecture: x86_64 (AMD64) - Wine does not support ARM Linux
- Distro: Any modern Linux distribution (Ubuntu 22.04+, Fedora 38+, Arch, openSUSE, etc.)
- Disk Space: ~500 MB for Wine + NMSE
Wine 9.0 or later is recommended for best .NET WinForms compatibility.
Ubuntu / Debian / Linux Mint:
# Enable 32-bit architecture (required by Wine)
sudo dpkg --add-architecture i386
# Install Wine
sudo apt update
sudo apt install wine64 wine32
# Verify
wine --version
# Should show wine-9.x or laterFedora:
sudo dnf install wine
wine --versionArch Linux / Manjaro:
sudo pacman -S wine
wine --versionopenSUSE:
sudo zypper install wine
wine --versionWineHQ (Latest stable - all distros):
For the latest Wine version, use the official WineHQ repository: https://wiki.winehq.org/Download
This is the simplest method if you already have Wine installed.
# Create a directory for NMSE
mkdir -p ~/NMSE && cd ~/NMSE
# Download the latest Windows build from the GitHub releases page:
# https://github.com/vectorcmdr/NMSE/releases
#
# Or use the GitHub API to find and download the latest release zip:
DOWNLOAD_URL=$(curl -s https://api.github.com/repos/vectorcmdr/NMSE/releases/tags/latest \
| grep -o '"browser_download_url": "[^"]*\.zip"' \
| head -1 | cut -d'"' -f4)
wget "$DOWNLOAD_URL" -O NMSE-latest.zip
# Extract
unzip NMSE-latest.zip -d app/# Download the launch script
wget https://raw.githubusercontent.com/vectorcmdr/NMSE/main/scripts/linux/nmse.sh
chmod +x nmse.sh./nmse.shThe script will:
- Detect your Wine installation
- Create a dedicated Wine prefix at
.nmse-wineprefix/ - Show your NMS save file location
- Launch NMSE
~/NMSE/
├── nmse.sh # Launch script
├── app/ # NMSE Windows build
│ ├── NMSE.exe
│ ├── Resources/
│ │ ├── json/
│ │ ├── images/
│ │ ├── icons/
│ │ ├── ui/
│ │ └── map/
│ └── ...
└── .nmse-wineprefix/ # Wine prefix (created on first run)
./nmse.sh # Normal launch
./nmse.sh --debug # Launch with Wine debug logging (writes nmse-wine.log)
./nmse.sh --reset-prefix # Delete and recreate the Wine prefix
./nmse.sh --winecfg # Open Wine configuration dialog
./nmse.sh --help # Show helpAn AppImage bundles NMSE together with Wine into a single executable file. No Wine installation needed - just download, make executable, and run.
wget https://github.com/vectorcmdr/NMSE/releases/download/latest/NMSE-x86_64.AppImage
chmod +x NMSE-x86_64.AppImage./NMSE-x86_64.AppImageThat's it. The AppImage contains everything needed.
The AppImage internally contains:
- The NMSE Windows build (self-contained .NET)
- A minimal Wine installation
- The
AppRunentry script that configures and launches everything
The Wine prefix is stored at ~/.local/share/nmse/wineprefix/ and persists across AppImage updates.
If you want to build the AppImage yourself (e.g. from a development build):
# On Windows: publish NMSE
dotnet publish NMSE.csproj -c Release -r win-x64 --self-contained
# Copy the publish output to your Linux machine, then:
cd scripts/linux/
./build-appimage.sh /path/to/publish/output/See scripts/linux/build-appimage.sh for details.
Bottles is a user-friendly graphical Wine manager for Linux.
See the dedicated Bottles Linux Guide for step-by-step instructions.
When running NMSE under Wine, you need to navigate to your NMS save files using Wine's path mapping. Wine maps the Linux root filesystem as drive Z:\.
Linux path:
~/.local/share/Steam/steamapps/compatdata/275850/pfx/drive_c/users/steamuser/AppData/Roaming/HelloGames/NMS
In NMSE's directory browser:
Z:\home\<username>\.local\share\Steam\steamapps\compatdata\275850\pfx\drive_c\users\steamuser\AppData\Roaming\HelloGames\NMS
Linux path:
~/.var/app/com.valvesoftware.Steam/data/Steam/steamapps/compatdata/275850/pfx/drive_c/users/steamuser/AppData/Roaming/HelloGames/NMS
In NMSE: Navigate via Z:\home\<username>\.var\app\com.valvesoftware.Steam\...
- The
nmse.shlaunch script automatically detects and displays your save path - Inside the save directory, select the profile folder (e.g.,
st_76561198xxxxxxxxx) - After selecting the directory, NMSE will auto-detect save slots
| Feature | Status | Notes |
|---|---|---|
| All 20 editor panels | ✅ Works | Tabs, controls, data display all function correctly |
| Save file loading/saving | ✅ Works | .NET file I/O translates seamlessly |
| Inventory grid (custom GDI+ rendering) | ✅ Works | Wine's GDI+ implementation handles this well |
| Icons and images | ✅ Works | PNG loading via .NET managed code |
| Localisation (16 languages) | ✅ Works | JSON file loading, menu switching |
| MessageBox dialogs | ✅ Works | Standard Win32 message boxes |
| File open/save dialogs | ✅ Works | Wine translates to native dialogs (paths show as Z:\) |
| Clipboard copy/paste | Occasionally quirky between Wine and Linux clipboard | |
| Custom font (NMSGeoSans) | PrivateFontCollection may need Wine font configuration | |
| DPI scaling | May need manual DPI setting in Wine configuration |
The launch script sets these overrides for best compatibility:
WINEDLLOVERRIDES="mscoree=d;mshtml=d"mscoree=d- Disables Wine's built-in .NET/Mono (NMSE bundles its own .NET runtime)mshtml=d- Disables the Gecko HTML engine installer (not needed)
[NMSE] ERROR: Wine not found.
Install Wine 9.0+ using your package manager (see Prerequisites).
If fonts look wrong or the NMS custom font doesn't load:
# Install Windows core fonts
WINEPREFIX=~/.nmse-wineprefix winetricks corefonts
# Or install all common fonts
WINEPREFIX=~/.nmse-wineprefix winetricks allfontsIf the application looks too small or too large:
# Open Wine configuration
./nmse.sh --winecfg
# In the Graphics tab:
# - Check "Emulate a virtual desktop" for testing
# - Adjust the Screen Resolution (DPI) slider
# - 96 DPI = 100%, 120 DPI = 125%, 144 DPI = 150%# Run with debug logging
./nmse.sh --debug
# Check the log file
cat nmse-wine.log | head -50Common issues:
- Missing NMSE.exe: Ensure the
app/directory contains the published build - Wrong Wine version: Update to Wine 9.0+ (
wine --version) - Corrupted prefix: Reset with
./nmse.sh --reset-prefix
This is normal. Wine maps the Linux filesystem as drive Z:\:
| Wine Path | Linux Path |
|---|---|
Z:\ |
/ |
Z:\home\user |
/home/user |
C:\ |
~/.nmse-wineprefix/drive_c/ (Wine's virtual C: drive) |
If you see rendering artifacts:
# Try running without display compositing
LIBGL_ALWAYS_SOFTWARE=1 ./nmse.sh
# Or try Xwayland if on Wayland
GDK_BACKEND=x11 ./nmse.shNMSE must be published as a self-contained Windows x64 build to run under Wine:
# On Windows (or WSL2 with .NET SDK):
dotnet publish NMSE.csproj -c Release -r win-x64 --self-contained -p:PublishSingleFile=false
# The output at bin/Release/net10.0-windows/win-x64/publish/ contains:
# - NMSE.exe (the application)
# - Resources/ (icons, JSON databases, localisation files)
# - *.dll (framework and dependency assemblies)Note:
PublishSingleFile=trueis not recommended for Wine as it can cause issues with resource loading. KeepPublishSingleFile=false(the default) for best compatibility.
These are inherent limitations of running a WinForms app under Wine. They will be resolved when the native Eto.Forms port is complete.
-
Windows-style UI - NMSE looks like a Windows application (Windows title bars, Windows-style file dialogs) rather than a native Linux app.
-
File path display - Paths are shown in Windows format (
Z:\home\user\...) rather than Linux format (/home/user/...). -
No Wayland native support - Wine uses X11 (or XWayland on Wayland compositors). This usually works transparently but may cause minor issues on pure Wayland setups.
-
Bundle size - The AppImage is ~300–500 MB because it includes both Wine and the .NET runtime.
-
No system tray integration - Wine's system tray support varies by desktop environment.
-
Clipboard - Copy/paste between NMSE and native Linux applications usually works, but occasionally requires a focus change.
The Wine compatibility layer is an interim solution. The planned native cross-platform version will:
- Use Eto.Forms for the UI (native GTK on Linux, Cocoa on macOS, WinForms on Windows)
- Share all business logic via NMSE.Lib (platform-independent shared library)
- Look and feel native on each platform
- Be ~50 MB instead of ~300–500 MB
See the Cross-Platform Work Plan for the full migration roadmap.