All posts
02
03
04
05
06
07
08
09
10
11
12
Part 09 of 10
The Numbers
The complete before and after. No commentary, just data.
For everyone·6 min read
EVEMon v4.0.20Drag to compare →EveLens 1.0.0
Tests
Test Count
23
Test Files
4
Test Lines
417
Architecture Tests
0
Architecture
Static Events
69
Manual Subscriptions
218
Memory Leaks
6
ViewModels
0
Core Interfaces
0
Architectural Laws
0
The UI
UI Lines of Code
99,073
Windows / Dialogs
52
Dark Themes
0
Platforms
1
The Scheduler
UI Thread Invocations/sec
960
Concurrent HTTP Slots
999
Startup Requests (30 chars)
240
Code Quality
Dead Code Lines
18,072
God Object Lines
1,856
God Object References
929
Source Lines (total)
188,250
← This is where EVEMon was in March 2021
For everyone. The complete before/after. No commentary, just data.
Eighty-four days from a crash report to a stable release. Here's what changed.
Every number below was extracted from actual source code by reading both codebases file by file. Nothing is estimated. Everything is verifiable against the public repositories.
01The Codebase
.NET 8
from .NET 4.6.1
Avalonia
from WinForms
3
platforms (from 1)
7
assemblies (from 2)
| Dimension | Peter Han EVEMon v4.0.20 (March 2021) | EveLens 1.0.0-alpha.28 (March 2026) |
|---|---|---|
| .NET Version | Framework 4.6.1 (released 2015) | 8.0 (released 2023, LTS) |
| UI Framework | Windows Forms (released 2002) | Avalonia 11.2.3 (released 2024) |
| Operating Systems | Windows | Windows + Linux + macOS |
| Source Assemblies | 2 meaningful | 7 |
| Total C# Files (source) | 1,097 | 1,053 |
| Total C# Lines (source) | 188,250 | 123,861 |
| Test Files | 4 (+ 1 helper) | 110 |
| Test Lines | 417 | 26,605 |
Tests
23
Tests (before)
1,554
Tests (after)
67.6×
Increase
15
Categories covered
Before
23
After
1,554
| Metric | Before | After | Change |
|---|---|---|---|
| Test Count | 23 | 1,554 | 67.6x |
| Test Files | 4 | 110 | 27.5x |
| Test Lines | 417 | 26,605 | 63.8x |
| Test Framework | xUnit 2.1 (2015) | xUnit 2.9.2 (2024) | |
| Assertion Library | xunit.assert only | FluentAssertions 6.12.2 | |
| Mock Framework | Moq (referenced, never used) | NSubstitute 5.1.0 (107 mock creations) | |
| Areas Covered | 3 (async void scan, compression, time formatting) | 15 categories | |
| Architecture Tests | 0 | 32 | |
| CI/CD | None | Promotion system + pre-push hooks |
Architecture
69→0
Static events
218→0
Manual subscriptions
6→0
Memory leaks
0→27
Core interfaces
0→46
ViewModels
0→14
Architectural laws
| Metric | Before | After |
|---|---|---|
| Static Events on God Object | 69 | 0 |
| Event Subscriptions (manual +=) | 218 | 0 (auto-tracked IDisposable) |
| Leaked Event Subscriptions | 6 | 0 |
| Dead Events (never subscribed) | 5 | 0 |
| EveMonClient References | 929 from 150 files | 122 (being strangled) |
| ViewModels | 0 | 46 production + 10 display wrappers |
| Core Interfaces (DI) | 0 service interfaces | 27 in zero-dependency Core assembly |
| Lazy-Initialized Services | 0 | 31 |
| Architectural Laws | 0 | 14 (enforced by 32 tests) |
The God Object
| Metric | Before | After |
|---|---|---|
| EveMonClient Total Lines | 1,856 | ~650 (frozen, Law 9) |
| Static Event Declarations | 69 | 0 |
| OnXxx Firing Methods | 69 | 0 |
| References from Codebase | 929 | 122 (migration target) |
The Scheduler
960/s
UI invocations (before)
0
UI invocations (after)
∞
HTTP slots (before)
20
HTTP slots (after)
| Metric | Before | After |
|---|---|---|
| Architecture | UI-thread timer poll (1-second) | Background-thread priority queue |
| Monitors per Character | 31 (all polling independently) | Centralized fetch jobs |
| UI Thread Load (30 chars) | 960 invocations/second | 0 (scheduler on background thread) |
| Startup Behavior | Thundering herd (240+ simultaneous requests) | Phased cold start (4 phases, staggered) |
| Rate Limiting | Reactive only (stop at error threshold) | Per-character token buckets (150/15min) |
| Concurrent HTTP Slots | Unbounded (limited by connection pool) | SemaphoreSlim(20) |
| Auth Failure Handling | Each endpoint independently hits expired token | Isolate + suspend failed character |
| Tab-Switch Awareness | None (all characters equal) | Active/Background/Dormant priorities |
| HttpClient Creation | New per request (socket exhaustion) | Pooled |
| Diagnostic Visibility | Trace log file (unstructured text) | TCP JSON-lines stream (port 5555) |
The UI
99,073
UI lines (before)
25,639
UI lines (after)
74%
Reduction
6
Dark themes
| Metric | Before | After |
|---|---|---|
| Framework | Windows Forms | Avalonia 11.2.3 |
| Total UI Files | 251 .cs + 116 .Designer.cs | 54 .axaml + 80 .cs |
| Total UI Lines | 99,073 | 25,639 |
| Windows/Dialogs | 52 | 12 dialogs + main window |
| Character Tabs | 19 (WinForms UserControls) | 16 working + 3 coded but not wired |
| ViewModels | 0 | 46 |
| Dark Mode / Themes | 0 | 6 EVE-faction palettes |
| Design System | None | 563 lines of style overrides |
| Skill Visualization | None | GPU-accelerated SkiaSharp (834 lines) |
| WinForms Imports in Common | 66 | 0 |
| Largest UI File | MainWindow.cs (2,471 lines) | PlanUnifiedView.axaml.cs (2,470 lines) |
Cross-Platform
| Metric | Before | After |
|---|---|---|
| Platforms | Windows | Windows + Linux + macOS |
| Target Framework | .NET Framework 4.6.1 (Windows-only) | net8.0 (portable) |
| System.Windows.Forms in Common | 66 imports | 0 |
| System.Drawing.Image in Models | 7 files | 0 (all use object?) |
| Notification System | WinForms MessageBox | WinRT toast + notify-send + osascript |
| Path Resolution | Hardcoded %APPDATA%\EVEMon | XDG-compliant per-platform |
| Single Instance Detection | Named Semaphore (Windows-only) | File lock + optional named EventWaitHandle |
| Platform Service Adapters | 0 | 7 |
Dead Code
Certificate Browser
4,986
3D Pie Chart
4,299
Cloud Storage
2,612
Logitech G15 LCD
1,668
Mineral Worksheet
1,525
In-Game Browser
1,091
Other
1,891
18,072 lines removed
| Category | Lines Removed | Why It Was Dead |
|---|---|---|
| In-Game Browser Server | 1,091 | CCP removed IGB (2017) |
| Certificate Browser | 4,986 | CCP removed certificates (2014) |
| 3D Pie Chart | 4,299 | WinForms GDI+ only |
| Cloud Storage Sync | 2,612 | Deprecated SDKs |
| Logitech G15 LCD | 1,668 | Hardware discontinued (2008) |
| Mineral Worksheet | 1,525 | EVE-Central/BattleClinic dead |
| Market Pricers | 783 | EVEMarketer dead |
| Hammertime API | 420 | API shut down (~2020) |
| Process Watchdog | 357 | Hardcodes "EVEMon" |
| Osmium/BattleClinic | 223 | Sites shut down |
| Windows 7 Detection | 108 | Win7 EOL (2020) |
| Total | 18,072 |
Features: Verified Working
32
Features working
6
Themes
16
Character tabs
6
Not yet ported
Skill BrowserSkill QueueSkill PlannerAttributesStandingFactional WarfareMedalKill LogAssetsMarket OrdersContractsWallet JournalWallet TransactionsIndustry JobsPlanetary ColoniesResearch PointsMail MessagesNotificationsEmploymentCalendar EventsImplantsJump ClonesCharacter SheetOverview TabLoyalty PointsSkill CompletionQueue NotificationsMulti-characterCross-platformDark ThemesSettings PersistenceESI OAuth
LoadoutsShip BrowserBlueprint BrowserMineral WorksheetImplant CalculatorRoute Planner
| Feature | Status |
|---|---|
| Character Overview (card grid, portraits, ESI status dots) | Working |
| 16 Character Data Tabs | Working |
| Plan Editor (5 browser tabs) | Working |
| 6 EVE-Faction Dark Themes | Working |
| GPU Skill Constellation | Working |
| ESI Scope Editor (per-permission, 3 presets) | Working |
| Per-Category Privacy Mode (6 categories) | Working |
| SSO Authentication (OAuth2 PKCE) | Working |
| Native OS Notifications (Win/Linux/Mac) | Working |
| Per-Character Endpoint Toggle | Working |
| Activity Log / Notification Center | Working |
| Settings (6 sections, sidebar navigation) | Working |
| About Window (57+ contributor Hall of Fame) | Working |
| 6 Additional Dialogs (Groups, Plans, Implants, etc.) | Working |
| Total Working | 32 |
| Feature | Status |
|---|---|
| Planetary Tab | Code exists, not wired to UI |
| Research Points Tab | Code exists, not wired to UI |
| Character Comparison | Placeholder "Coming soon" |
| Booster Simulation | Not ported (didn't work in WinForms) |
| Mass Re-auth | Not ported (never shipped) |
| Factional Warfare Tab | Code exists, never populates data |
| Total Not Working | 6 |
Settings
| Metric | Before | After |
|---|---|---|
| Format | XML (XmlSerializer) | JSON (source of truth) |
| ESI Token Storage | Plain-text XML | JSON (DPAPI disabled for cross-platform) |
| Save Mechanism | 1-second timer with 10-second debounce | SmartSettingsManager with coalescing |
| Per-Character Storage | Single settings.xml file | Per-component files in character subdirectories |
| MessageBox.Show() in Settings | 6 calls | 0 (uses IDialogService) |
| Fork Migration | None | Auto-detect from %APPDATA%\EVEMon |
| Revision Bug (Issue #4) | 0 = both missing and zero | -1 for missing, 0 for zero |
The Git History
9,807
Total commits
57+
Contributors
20
Years active
356
EveLens commits
| Metric | Value |
|---|---|
| Total Commits (all branches) | 9,807 |
| Total Named Contributors | 57+ |
| First Commit | August 2, 2006 |
| Years Active | 20 |
| Dormant Gap | 4.75 years (Mar 2021 - Jan 2026) |
| Alia Collins Commits | 356 |
| Days of Active Development | 57 |
| Release Tags | 91 |
| Feature Branches | 47 |
The Rebrand
| Metric | Count |
|---|---|
| "EveLens" references in source | 4,820 |
| "EVEMon" references remaining | 1,067 |
| — of which: copyright headers | ~1,050 |
| — of which: About window attribution | 4 |
| — of which: migration code | 3 |
| — of which: external URLs | 3 |
| Accidental "EVEMon" leftovers | 0 |
Previous: Part 8 — The Linux Settings Saga
Next: Part 10 — Ship It