All posts
Part 08 of 10
12345678910111213141516171819202122alpha.1alpha.22 — fixed22 releases hunting one bug class
Part 08 of 10

The Linux Settings Saga

22 alpha releases hunting one bug class.

Engineers·8 min read

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.

01

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.

02

22 Releases in 4 Days

Each release fixed one assumption that worked on Windows and broke on Linux:

AlphaWhat brokeWhy
4Settings lost on shutdownWindows fires ShutdownRequested reliably. Linux doesn't.
5Taskbar icon missingLinux needs the window class set explicitly. Windows does it automatically.
6Data directory not foundApplicationData returns empty on some Linux environments. XDG paths needed.
7Window icon wrong formatICO files don't work on Linux. PNG required.
8Can't diagnose save failuresAdded detailed trace logging to every save step.
9Settings lost on closeOn Linux, the close event fires before the shutdown event. Save in the wrong one and you lose data.
10App hangs on closeThe async save deadlocked on Linux's event loop. Made shutdown save synchronous.
13Periodic saves failingBackground saves using the UI thread's event loop silently dropped work on Linux.
15Settings manager deadlockThe coalescing save manager deadlocked on non-Windows dispatchers.
16-17Dispatcher inconsistency"Fire and forget" silently lost saves. Blocking calls caused deadlocks.
18Nuclear optionBypass the entire async pipeline. Write directly to disk.
20Serialization crashA Windows-only drawing library was buried in the settings serialization path. Linux doesn't have it.
21More drawing typesFound and replaced every Windows drawing type in the settings path.
22Missing file on first launchWindows creates missing directories automatically. Linux doesn't.
25Hidden drawing dependencyA 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.

03

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/EveLens
04

Was 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