The Linux Settings Saga
22 alpha releases hunting one bug class.
For engineers and anyone who thinks "cross-platform" means "it compiles."
Cross-platform is not a checkbox. It's a grind.
This is the story of 22 consecutive alpha releases over four days — alpha.4 through alpha.25 — hunting a single class of bug: settings not persisting on Linux and macOS.
The Bug
On Windows, you close EveLens, reopen it, and your settings are there. Characters, plans, theme, ESI tokens. It just works.
On Linux, you close EveLens. Reopen it. Everything is gone. Blank slate. First launch, every time.
The settings file existed on disk. The save code ran. Something in the pipeline was failing silently — and it was different on every Linux distribution.
22 Releases in 4 Days
Each release fixed one assumption that worked on Windows and broke on Linux:
| Alpha | What broke | Why |
|---|---|---|
| 4 | Settings lost on shutdown | Windows fires ShutdownRequested reliably. Linux doesn't. |
| 5 | Taskbar icon missing | Linux needs the window class set explicitly. Windows does it automatically. |
| 6 | Data directory not found | ApplicationData returns empty on some Linux environments. XDG paths needed. |
| 7 | Window icon wrong format | ICO files don't work on Linux. PNG required. |
| 8 | Can't diagnose save failures | Added detailed trace logging to every save step. |
| 9 | Settings lost on close | On Linux, the close event fires before the shutdown event. Save in the wrong one and you lose data. |
| 10 | App hangs on close | The async save deadlocked on Linux's event loop. Made shutdown save synchronous. |
| 13 | Periodic saves failing | Background saves using the UI thread's event loop silently dropped work on Linux. |
| 15 | Settings manager deadlock | The coalescing save manager deadlocked on non-Windows dispatchers. |
| 16-17 | Dispatcher inconsistency | "Fire and forget" silently lost saves. Blocking calls caused deadlocks. |
| 18 | Nuclear option | Bypass the entire async pipeline. Write directly to disk. |
| 20 | Serialization crash | A Windows-only drawing library was buried in the settings serialization path. Linux doesn't have it. |
| 21 | More drawing types | Found and replaced every Windows drawing type in the settings path. |
| 22 | Missing file on first launch | Windows creates missing directories automatically. Linux doesn't. |
| 25 | Hidden drawing dependency | A cloud storage provider loaded a Windows drawing type on initialization. Deferred it. |
After alpha.25, settings persisted correctly on all three platforms. A checkpoint tag was created: checkpoint-alpha25-settings-working.
The Four Assumptions That Broke
Dispatchers don't work the same everywhere. On Windows, posting work to the UI thread from a background thread is reliable. On Linux, "fire and forget" can silently drop work if the event loop is shutting down, and blocking calls can deadlock if the main thread is busy. The solution: for critical saves, bypass the dispatcher entirely. Serialize on whatever thread you're on, write to disk directly.
System.Drawing doesn't exist on Linux. Microsoft's own documentation says System.Drawing.Common is Windows-only starting with .NET 6. But it was buried deep in the settings serialization — a color type that needed a native graphics library that Linux doesn't have. It threw an error at runtime, not at compile time. Every settings type that touched it had to be found and replaced with raw color values.
Shutdown events aren't guaranteed. On Windows, the application gets a reliable "I'm about to close" event with time to save. On Linux, the window manager can kill the process without warning. The fix: save in the "window closing" event, not the "app shutting down" event. And that save has to be fully synchronous — no async, no threading, no dispatcher. Serialize to JSON, write bytes to file, done.
File paths aren't universal. Windows always has an AppData folder. Linux inside containers, AppImages, or snaps might not. The fix: full XDG compliance with a fallback chain.
Windows: %APPDATA%\EveLens
Linux: $XDG_CONFIG_HOME/EveLens → ~/.config/EveLens → ./data/
macOS: ~/Library/Application Support/EveLensWas It Worth It
22 alpha releases in four days. Most of them fixing things that "just work" on Windows because the entire .NET ecosystem assumes Windows.
For the first time in twenty years, an EVEMon-family tool runs natively on Linux and macOS. No Wine. No emulation. The same features, the same themes, the same skill planner. EVE players on Linux — who run the game through Proton — finally have the companion tool that Windows players have had since 2006.
Yes. It was worth it.
Previous: Part 7 — Three Platforms, One Codebase
Next: Part 9 — The Numbers