All notable changes to this project will be documented in this file.
- Update Checker: The app now checks for new releases via the GitHub API on startup (every 24 hours) and offers a "Check for Updates" option in the right-click menu. Users can download the latest version, skip a specific release, or disable the check entirely in Settings > Behavior.
- Support Dialog: Added a "Support this Project" menu item with links to GitHub Sponsors, Ko-fi, Buy Me a Coffee, and Star on GitHub.
- LibreHardwareMonitor Notice: When temperature or power readouts are enabled but no data source is detected after startup, a one-time notification explains that LibreHardwareMonitor (or OpenHardwareMonitor) is required and links to the download page.
- RDP Session Detection: Automatic detection of Remote Desktop sessions via
GetSystemMetrics(SM_REMOTESESSION). GPU monitoring is skipped and App Activity displays an informational message instead of attempting unreliable psutil queries in virtualized environments.
- Context Menu Grouping: Right-click menu items are now organized into logical groups with separators (windows / updates & support / exit) for easier scanning.
- Global Window Icon: All application windows and dialogs (including update and support popups) now display the NetSpeedTray icon in the title bar.
- README Overhaul: Rewrote the README to reflect all v1.3.0/v1.3.1 features including hardware monitoring, App Activity, display modes, and RDP detection. Moved the Support section above Building from Source for better visibility.
- App Crash in RDP (Windows Server): GPU polling errors are now caught and logged independently without incrementing the circuit breaker's consecutive error counter, preventing GPU failures from killing the entire monitor thread and crashing the app.
- App Sluggishness in RDP: Wrapped
psutil.net_connections()in a daemon thread with a 2-second timeout to prevent the App Activity window from stalling the 1-second polling loop in RDP and low-privilege environments. - Graph Render Crash (
datetimetype error): Fixedfloat() argument must be a string or a real number, not 'datetime.datetime'by requesting raw numeric timestamps from the database and adding a defensive type guard before numpy conversion. Also applied to the Overview tab's database-backed path. - Color Coding Always Yellow/Orange: Fixed color coding failing on configs migrated from v1.2.6 by replacing the broken threshold repair logic (which set
low = high, still leaving the band unreachable) with a cross-field guard that resets both thresholds to defaults when thelow < highinvariant is violated. - Swap Upload/Download Checkbox: The "Swap upload/download" setting now correctly swaps both the speed values/units and arrow icons together. Previously only the arrow icon was swapped while upload and download values always rendered in fixed positions.
- Vertical Taskbar Layout: Widget layout mode is now determined from the taskbar edge position (Left/Right edge → horizontal layout, Top/Bottom edge → vertical layout) instead of the unrelated
is_small_taskbar()height check, fixing broken widget rendering on vertical taskbars. - Config Migration Resetting Display Mode: Removed
side_by_sidefrom the display mode downgrade rule — it gracefully degrades to network-only at render time and no longer silently resets tonetwork_onlywhen hardware monitors are disabled. Also cleaned up deadcpu_only/gpu_onlybranches that could never trigger and tightened thecycledowngrade condition to gate only on CPU/GPU (not RAM/VRAM). - Widget Flickering: Eliminated per-paint Win32 taskbar enumeration by caching the layout mode and refreshing it only on taskbar geometry changes. Also removed redundant
setRenderHint(Antialiasing)calls in the icon and mini-graph paint paths. - High-DPI Widget Clipping: The
MAX_WIDGET_WIDTH_PX/MAX_WIDGET_HEIGHT_PXsafety constraints are now scaled by the display's DPI factor, preventing text truncation on 4K and other high-DPI screens. - Dialog Close Hiding Widget: Fixed all popup dialogs (update checker, support, LHM notice) using
parent=None, which caused closing the dialog to also hide the widget. Dialogs now correctly parent to the widget. - nvidia-smi Console Flash: Hidden the console window that briefly appeared every poll cycle when using
nvidia-smifor GPU temperature/power readings. - Widget Spacing with Temp/Power: Tightened the layout width reference strings for temperature and power suffixes, reducing excess gap between the widget and the system tray when hardware readouts are enabled.
- Temperature readings are displayed in °C only. Fahrenheit support is planned for v1.4.0.
- Updated Pillow, pytest, and Pygments dependencies for CVE fixes.
- App Activity Window: Added an App Activity window (accessible from the tray menu) to view estimated per-app network activity (includes a non-admin mode with reduced accuracy).
- Hardware Monitoring: Added CPU/GPU utilization tracking and optional RAM/VRAM readouts (vendor-agnostic GPU support via Windows Performance Counters / PDH).
- Optional Temperature Readouts: Added a widget toggle to show CPU/GPU temperatures when available. Sources are tried in priority order: LibreHardwareMonitor/OpenHardwareMonitor WMI (all vendors, requires admin),
nvidia-smi(NVIDIA GPU), and Windows PDH Thermal Zone / WMI ACPI (CPU fallback).Note: CPU and GPU temperatures require a kernel-level driver on most modern hardware. Install LibreHardwareMonitor and run it as Administrator — NetSpeedTray will detect it automatically. NVIDIA GPU temperature also works natively via
nvidia-smi. - Optional Power Readouts: Added a widget toggle to show CPU/GPU power draw in Watts. Uses Intel RAPL via PDH (non-admin) for CPU,
nvidia-smifor NVIDIA GPU, and LibreHardwareMonitor/OpenHardwareMonitor for all GPU vendors. - Graph Window Hardware Views: Added CPU and GPU history tabs, plus a refreshed Overview tab with live-updating, synchronized Network/CPU/GPU charts and quick at-a-glance stats.
- Widget Layout Modes: Added Side-by-Side and Cycle display modes, a stacked CPU+GPU column option, and per-segment display ordering (Network/CPU/GPU/None).
- Context Menu Graph Access: Added "Show Graph" to the right-click context menu for easier graph window discovery (previously only accessible via double-click).
- Hardware Data Retention: Added hourly aggregation tier for hardware stats (matching speed data's 3-tier architecture: raw 24h → minute 30d → hour user-configurable), preventing data loss after 30 days.
- LibreHardwareMonitor Integration: Auto-detects a running LibreHardwareMonitor or OpenHardwareMonitor instance via WMI, enabling temperature and power readings across all GPU vendors. The probe retries each poll cycle, so LHM can be started after NetSpeedTray.
- Settings UI Redesign: Consolidated settings pages from 8 to 6. Merged Mini Graph into Appearance, Troubleshooting into a footer Export Log button, and moved Tray Offset to General (renamed "Options" → "Behavior"). Removed the AdaptiveStackedWidget in favor of a fixed-size dialog with per-page scroll areas to eliminate resize oscillation and taskbar overlap on 1080p.
- Collapsible Hardware Settings: Replaced the Hardware page's three QGroupBoxes with CollapsibleSection accordion widgets (Hardware Monitoring expanded, Widget Display Mode and Display Order collapsed by default) to reduce visual density on small screens.
- Win11 Flat Card Styling: Removed QGroupBox borders across all settings pages, keeping subtle background + border-radius for a modern Windows 11 flat card aesthetic.
- Interface Mode Subtitles: Added visible subtitle descriptions below each monitoring mode radio button (replacing hard-to-discover tooltips) explaining what each mode does.
- Clearer Labels: Renamed "Force MB Display" → "Always Show Megabytes", "Stacked Column" → "Stacked", "Cycle All" → "Auto-Cycle", "All Physical Interfaces" → "Physical Adapters Only", "All Interfaces (including virtual)" → "All Adapters", and "Label Style" → "Indicator Style".
- Hardware Settings UI: Expanded the Hardware settings page with clearer Windows 11-style controls (hardware toggles, label style, widget mode, display order, temperature and power options).
- Graph Window Layout: Unified spacing/padding and status-bar placement across tabs for a more consistent Windows 11 look and feel.
- Widget Layout: Improved width budgeting for multi-segment modes and increased spacing between the Network and CPU/GPU sections.
- Localization: Translated all new UI keys (hardware power, monitoring mode subtitles, collapsible section titles) across all 9 supported locales. Maintained strict key parity via
test_locales_parity. - Log Noise Reduction: Hardware monitor "0 temperature sensors" INFO message now only appears once per namespace per app session instead of every poll cycle.
- Updated Defaults: Adjusted default configuration to better match recommended settings: font weight Normal (400), separate arrow font enabled, decimal places 1, side-by-side widget mode, monochrome hardware icons, hardware temps enabled, stacked stats enabled.
- GPU Polling Refactor: Replaced the opaque GPU poll 4-tuple with a structured
GpuPollResultNamedTuple for clearer code and extensibility (now includes power field).
- Tray Offset Y Default: Fixed a copy-paste bug where the Y-offset fallback incorrectly used the X-offset default constant.
- Hardware Aggregation Idempotence: Changed hourly hardware stats aggregation from
INSERT OR IGNOREtoINSERT OR REPLACEto prevent silent data loss if maintenance re-runs after a crash. - COM/WMI Resource Cleanup: Added proper
CoUninitialize()and WMI object release in the monitor thread shutdown path to prevent COM reference leaks.
- High-DPI Alignment Fix: Improved vertical centering of the widget on Windows 11 high-DPI displays by accurately calculating the visible taskbar region.
- Widget Visibility Constraints: Added
MAX_WIDGET_WIDTH_PX(500) andMAX_WIDGET_HEIGHT_PX(100) constraints to prevent the widget from growing too large and becoming inaccessible. - Graph Peak Tag Improvements: Lowered the horizontal flip threshold (0.88 -> 0.8) and improved vertical alignment to prevent peak labels from being cut off on graph edges.
- Unit Testing: Added
test_renderer_logic.pyand updatedtest_position_manager.pyto ensure regression-free positioning and rendering.
- Settings UI Enhancement: Increased the Settings Dialog minimum size to 650x560 to ensure compatibility with high-DPI screens and longer translations.
- Smart Updates Constraint: Unified "Force MB" and "SMART" update rate logic; SMART mode is now automatically disabled when "Force MB" is off to prevent unit-switching jitter.
- Layout Precision: Fixed layout width calculations in
WidgetLayoutManagerto correctly respect theshort_unit_labelssetting, preventing text truncation. - Positioning Robustness: Enhanced
PositionCalculatorwith unified property calculation and improved error handling for temporary taskbar detection failures. - Settings Consolidation: Merged arrow styling settings into the Appearance page for a more streamlined configuration flow.
- Log Noise Reduction: Reduced log chatter by changing "Spike detected" messages from
WARNINGtoDEBUGlevel.
- Resolved an issue where the widget could "disappear" or be positioned incorrectly when used with very large fonts or small taskbars.
- Fixed a rare race condition where the widget would fail to re-anchor correctly after a shell restart or display change.
- Corrected peak tag positioning in corner cases (top-right and top-left peaks).
This is a major stability and reliability release that resolves several critical bugs, preventing data loss, off-screen widgets, and visual distortions. It also introduces new features and a massively expanded test suite to ensure flawless performance on a wide range of hardware.
-
Phantom Spike Elimination: A comprehensive, multi-layered defense system has been implemented to eliminate "phantom" speed spikes and ensure accurate graph statistics.
- Problem: OS scheduling jitter and statistical anomalies caused brief, impossible speed readings, distorting graph scales and averages.
- Solution:
- Time-Delta Clamping: Increased minimum time difference to 10ms to filter out scheduling artifacts (
constants/network.py). - Statistical Outlier Filtering (IQR): Added Interquartile Range (IQR) filtering to remove statistical spikes from graph data before rendering (
views/graph/logic.py). - Historical Spike Detection: Implemented a rolling average checker in the main controller to detect and clamp sudden spikes inconsistent with recent traffic (
core/controller.py). - Intelligent Y-Axis Scaling: The graph's Y-axis now uses a 95th percentile calculation to prevent single spikes from squashing the entire visualization (
utils/widget_renderer.py).
- Time-Delta Clamping: Increased minimum time difference to 10ms to filter out scheduling artifacts (
- Impact: Over 99.5% of speed spikes are eliminated or masked, resulting in accurate and readable graphs.
-
Hardware-Aware Link Speed Clamping: Introduced a dynamic clamping system that respects the actual capabilities of your network adapter.
- Problem: Fallback limits were static (10 Gbps), potentially allowing invalid readings on 1 Gbps lines or conversely capping performance for users with 10 Gbps or 100 Gbps hardware.
- Solution: The controller now queries
psutil.net_if_stats()to determine the negotiated physical link speed and uses it as a hard ceiling (plus a 5% jitter margin) for data validation. - Future-Proofing: Raised the absolute fallback ceiling to 100 Gbps for virtual adapters where link speeds cannot be queried.
-
Historical Graph Data Fixed: Corrected a critical bug where historical graph timelines (24H, Week, Month, All) would show no data.
- Problem: The data query logic only checked single aggregated tables (e.g.,
speed_history_minute), ignoring fresh, un-aggregated raw data. - Solution: Refactored
WidgetState.get_speed_history()to construct multi-tier UNION queries. These queries combine data from raw, minute, and hour tables (speed_history_raw,speed_history_minute,speed_history_hour) to ensure a complete and accurate dataset is always returned. - Impact: All timeline views now display data correctly, eliminating the empty or stale graphs seen in previous versions.
- Problem: The data query logic only checked single aggregated tables (e.g.,
-
Invisible Widget Prevention: Fixed a critical bug where the widget could become oversized and positioned off-screen, making it invisible.
- Problem: No upper bounds were enforced on widget size, allowing a positioning bug to create an invisible, 2000px+ widget.
- Solution: Introduced
WidgetConstraintswith maximum width/height (constants/ui.py) and implemented size clamping inPositionCalculator.calculate_position()to ensure the widget always remains within safe, visible screen bounds. - Impact: Prevents a catastrophic UX failure where the widget would disappear completely.
-
Configuration Safeguards: Hardened the config migration process to prevent silent failures and data loss.
- Problem: Invalid version strings in the config would cause migration logic to fail silently, risking user settings.
- Solution: Updated
_version_less_than()to raise a customConfigError. The migration process (_migrate_config()) now catches this error, logs it, and safely resets the configuration to prevent corruption. - Impact: Ensures user settings are safely migrated or reset, preventing silent data loss during upgrades.
- Keep Widget Visible in Fullscreen (#107): Added a new option (
keep_visible_fullscreenin General settings) to keep the widget visible during fullscreen applications (e.g., games, F11 browser mode). This is disabled by default.
- Graph & UI:
- Removed a non-functional "Legend" toggle that could cause crashes in dual-graph mode. (#100)
- Fixed an issue where the graph settings panel would shrink when toggled. (#103)
- Fixed Y-Axis Label Clipping: Increased graph left-margin from 8% to 12% to prevent "Download" labels from being cut off on high-speed connections.
- Corrected Graph Peaks: Fixed a data mismatch where raw database spikes (pre-filtering) were incorrectly plotted despite being filtered from the text stats.
- Corrected widget positioning on high-DPI displays (125%/150%) to fix cumulative rounding errors. (#104)
- Fixed text truncation and misalignment when using the
short_unit_labelssetting. (#106)
- Multi-Monitor & Taskbar:
- The widget can now be dragged freely across multiple monitors while in "free-move" mode. (#102)
- Added intelligent font scaling to improve readability on narrow vertical taskbars. (#99)
- Korean (ko_KR): Updated with improved phrasing and technical terminology (Thanks @VenusGirl, PR #101).
- Massively Expanded Test Suite: Added over 50 new unit tests to lock in stability for critical systems.
- Developer Experience: Added
build-exe-only.batto the repository, allowing developers to quickly compile the standalone executable without the overhead of building the full setup installer.
- Developer Experience: Added
- Positioning (
test_positioning_edge_cases.py): Added 20 focused tests covering ultrawide displays (21:9, 32:9), mixed-DPI transitions, multi-monitor boundaries, and extreme resolutions from 800x600 to 8K.- Configuration (
test_config.py): Added 7 new tests for version validation to prevent invalid or corrupt settings from being saved. - Widget Sizing: Added 4 new tests to validate widget dimension constraints.
- Configuration (
- Code Health & Refactoring:
- Improved
PositionManagerfor better maintainability. - Extracted over 20 hardcoded rendering values to tunable constants in
RendererConstants. - Added a
threading.Lockto the gradient cache inGraphRendererto prevent race conditions. - Refactored a nested function into a standalone
_process_plot_segment()method for better testability.
- Improved
- Smart Downsampling (10K+ Fix): Implemented stride-based downsampling that caps graph data at 2,000 points. Switching to long timelines like BOOT or ALL is now near-instant even with years of data.
- Adaptive Gap Detection: Resolved a UI freeze where large gaps in data caused redundant rendering loops. The system now automatically adjusts gap sensitivity based on data density.
- Database Schema v3 Migration: Upgraded the internal SQLite schema to Version 3. This includes:
- Covering Indexes: New
idx_minute_coveringandidx_hour_coveringindexes serve graph queries directly from memory for maximum performance. - Advanced Metadata: Added granular tracking for database creation time and improved migration safety with automated backups.
- Covering Indexes: New
- Instant Switch UI: Added immediate graph clearing and a "Loading..." indicator when switching timelines to provide better feedback during data retrieval.
- Locked Graph Layout: Standardized subplot margins (8% left) so the "graph box" width remains identical across all views, regardless of Y-axis label length. No more "jumping" grid boxes.
- Trailing Bridges to "Now": Added dashed bridging lines that connect the last recorded data point to the current time, ensuring the graph always feels active and fills the entire X-axis.
- Strict Edge Alignment: Eliminated horizontal margins (
xmargin=0) so data flows perfectly from the exact left to the exact right of the grid. - High-Res Time Labels: Automatically switches to seconds resolution (
%H:%M:%S) for extremely short ranges, preventing repeating labels in the Session view. - Multi-Layer Peak Markers: Refined glowing indicator dots for Max and Peak speeds with a three-layer glow effect and magnetic snapping.
- Integrated Graph Status Indicator: Replaced overlapping "No Data" overlays with a professional, three-state status light (LIVE/LOAD/NO DATA) integrated into the stats bar.
- Refined Data Retention UI: Integrated the duration label directly into the Windows 11 slider handle and implemented conditional database size display (visible only for the "ALL" duration).
- Explicit Exit Logic (#98): Fixed a critical bug where closing the settings or graph windows could inadvertently shut down the entire application.
- Y-Axis Sticky Logic: Integrated "Sticky Top" scaling that prevents the Y-axis from jittering when speed fluctuates slightly, while still adapting to huge spikes.
- Thread-Safe Cleanup: Hardened the exit sequence for database workers and background monitors to ensure zero "dangling" processes on shutdown.
- Korean (ko_KR) Refinement (#97): Major update with idiomatic phrasing and improved technical terms. (Thanks @VenusGirl!)
- Universal Locale Parity (#90): Synchronized all 9 supported languages with new descriptive tooltips and technical parity.
- Vertical Taskbar Support (#99): Intelligent font-scaling engine for vertical taskbars with automatic text shrinking.
- Geometry Debouncing: High-frequency coordinate filter eliminates redundant UI operations.
- Intelligent Drag Persistence: Smart anchoring remembers relative offset from taskbar tray.
- Window State Persistence: Settings Menu and Graph Window remember their last screen positions.
- Instant Timeline Pills: Replaced the legacy slider with a modern segmented button array:
SESS | BOOT | 24H | WEEK | MONTH | ALL. - Optimized Defaults: The graph now defaults to the 24H timeline, identified as the most useful starting point for most users.
- Window State Persistence: Settings and Graph windows now remember their last screen positions across app restarts.
- O(log n) Lookup: Implemented binary search for nearest-point finding, ensuring fluid tooltip movement even on high-resolution displays.
- Blitting Performance: Cached static background with dynamic artist redraws for a smooth 60 FPS interaction experience.
This release addresses the remaining critical bug reports tracked in the v1.2.x series, focusing on graph performance and accuracy, settings UX, and rendering glitches.
- Korean (ko_KR): Major update with idiomatic phrasing and improved technical terms (Thanks @VenusGirl for the contribution! #95)
- French (fr_FR): Updated translation with corrections and improvements (Thanks @logounet for the contribution! #94)
- Multi-language Audit: Synchronized and updated missing terms across all supported languages (Russian, Spanish, Dutch, Polish, Slovenian).
- Modular Settings Architecture: Decomposed the monolithic settings dialog into dedicated page classes (
AppearancePage,GraphPage, etc.) located in a newpages/sub-package for significantly better maintainability. - Core Logic Decoupling: Extracted complex logic from
NetworkSpeedWidgetinto specialized controllers:ConfigController: Now handles the entire settings lifecycle, including loading, saving, and rollbacks.InputHandler: Centralizes all mouse and keyboard events, separating user interaction from display logic.
- Adaptive Component Design: Implemented a custom
AdaptiveStackedWidgetthat allows the settings window to resize dynamically based on the current page's content. - Throttled Configuration Engine: Added a
QTimer-based throttling mechanism to prevent redundant disk I/O when making rapid adjustments in the settings menu.
- Custom Arrow Styling: Added granular control over arrow font family and size, independent of the speed value text.
- Settings Menu Streamlining: Merged the standalone "Arrows" tab into the "Appearance" page, simplifying the navigation hierarchy (Visuals vs. Data rules).
- Modernized Mini-Graph: Updated the widget's background graph to use a premium "Area Chart" style with gradient fills, smoother lines (antialiased), and improved Z-ordering (graph now properly sits behind text).
- Streamlined Interface Selection: The specific interface list is now hidden by default to reduce visual clutter, automatically appearing only when "Select Specific Interfaces" is chosen.
- Enhanced Control Visibility: Fixed rendering issues where radio buttons and checkboxes could become invisible in certain themes. Implemented custom, high-contrast circular styling for all radio buttons to ensure perfect visibility.
- Visual Polish: Resolved transparency artifacts (black backgrounds) in the interface selection list.
- Adaptive Text Spacing: Optimized the whitespace between arrows and speed values. Units like
MiB/snow use tighter, cleaner spacing (3-digit reservation), whileMbpsmaintains a safe buffer for Gigabit speeds to prevent layout jitter. - Windows 11 Slider Styling: Updated all sliders to match the modern Windows 11 Fluent Design with thinner borders, precise handle sizing, and better hover states.
- Restored Speed Color Coding (#90): Brought back full customization for color coding thresholds and colors in the Appearance settings.
- Smart Settings Auto-Resize: The settings window now dynamically expands when toggling features and intelligently repositions itself upward if the expansion would go behind the taskbar on 1080p screens.
- Enhanced Font Weight Slider: Replaced raw number inputs with a descriptive slider (e.g., "Regular", "Bold", "Extra Black") for easier configuration.
- Reduced Log Verbosity: Demoted over 30 redundant initialization and routine cleanup messages from
INFOtoDEBUG, resulting in much cleaner and more readable log files. - Architectural Polish:
- Shadowed Property Fix: Renamed
self.fontandself.metricstoself.current_fontandself.current_metricsto prevent internal conflicts with nativeQWidgetmethods. - Deduplication: Removed a redundant second implementation of the mini-graph rendering logic.
- Shadowed Property Fix: Renamed
- DRY Consolidation: Centralized all timeline duration logic, aggregation thresholds, and resolution rules into
constants/data.pyto ensure consistency between the database layer and multiple UI components. - Dead Code Cleanup: Removed legacy startup registry logic from the main widget that was left over from recent architectural refactors.
- Critical Memory Leak Fix: Resolved an issue where graph tooltips were creating orphan
QLabelwidgets on every timeline switch. Added explicitdeleteLater()cleanup to prevent memory accumulation over prolonged sessions. - Strict Rendering Caps: Enforced a hard 800-point limit for all graph views (including 'Session'). The downsampling algorithm is now universally applied, preventing UI thread freezes during high-volume data rendering.
- Robust Date Handling: Added failsafes around the plot date conversion loop to prevent renderer crashes even if data capping fails.
- Zero-Latency Interactions: Implemented a dual-timer debouncing system (150ms for data updates, 500ms for configuration saves) that prevents UI "freezing" when rapidly adjusting sliders or filters.
- Intelligent Database Tier Selection: Rewrote data retrieval to automatically select the most efficient single table (
raw,minute, orhour) based on the requested time range, eliminating the overhead of complexUNION ALLqueries for common views. - Graph Caching & Smart Updates: Implemented efficient in-place data updates for the "Live Session" graph, significantly reducing CPU usage during active monitoring.
- Improved Aggregation Accuracy: Fixed a long-standing "binning shift" where data points in long-term views were forced to the start of their time window. Plot points are now rendered at the mean timestamp of their respective bins, providing a more accurate representation of the data.
- System Uptime Precision: Resolved an issue where the "System Uptime" timeline showed inconsistent X-axis labels; it now correctly uses boot-time synchronization and high-precision locators.
- Obsolete Request Cancellation: The background data worker now checks for newer request IDs and instantly skips processing for stale requests, ensuring the UI remains responsive under heavy interaction.
- Startup Path Safety: Fixed a critical issue where launching via Registry could fail due to incorrect working directory resolution (
cwdcorrectness). - Dev-Mode Protection: Added safeguards to
startup_managerto prevent development instances from accidentally overwriting production registry keys. - Critical Font Crash Resolved: Fixed a regression where interacting with the font selection dialog would crash the application due to a return-value swap (passing a boolean instead of a font object).
- Defensive Type Checking: Added explicit
isinstancechecks andtry...exceptblocks in the settings application layer to prevent future crashes from malformed configuration data. - Widget Rendering Glitches:
- Hide Arrows (#84) & Unit Suffix (#86): Fixed rendering logic that ignored these "Show/Hide" preferences in certain layout modes.
- Font Style Visibility (#88): Resolved a bug where changing font styles could cause the widget to disappear.
- Font Weight Scaling (#89): Added robust support for legacy string values (e.g., "bold", "normal") when loading weights from older configuration files.
- Positioning Stability:
- Free Move Snapping (#87): Refined the "Free Move" logic to ensure the widget is correctly constrained to screen bounds.
- Tray Offset (#92): Validated and fine-tuned the widget's offset calculations relative to the system tray.
- Graph Settings Sliders (#93): Replaced editable text boxes in graph settings with read-only labels for "Timeline" and "Retention" sliders to prevent invalid input.
This is a hotfix release addressing immediate UI and stability issues reported after v1.2.1.
- Settings Window Stability (#81): Enforced a minimum size of
620x500for the settings dialog to prevent layout breakage and hidden sidebar items. - Log Cleanup (#83): Synchronized UI configuration keys with the backend schema to eliminate "ignoring unknown fields" warnings.
- I18n Parity (#82): Added missing
FIXED_WIDTH_VALUES_LABELto the English locale to resolve start-up validation warnings. - Dev Mode Silence: Suppressed the "Startup key path mismatch" warning when running from source or virtual environments.
This is a major stable release that combines significant performance overhauls with critical stabilization fixes. It introduces vectorized graph processing, a modular settings architecture, and definitive fixes for long-standing accuracy and layout issues.
- Zero-Latency Timeline Switching: Removed a 100ms synchronous freeze in the graph data retrieval path, making the interface feel significantly more snappy.
- Obsolete Result Filtering (Sequence IDs): High-speed slider interaction no longer causes a "render backlog"; the UI now instantly drops stale results, preventing cumulative performance degradation.
- Resource Caching: Implemented a 60-second cache for static values like system boot time and earliest database records to minimize redundant system calls.
- Background Monitoring Thread: Offloaded network polling to a dedicated thread, ensuring consistent 60+ FPS widget movement and zero micro-stutters during network stack latency.
- Vectorized Graph Logic: Replaced legacy loop-based processing with vectorized NumPy operations, achieving a 42x speed improvement in graph rendering for large datasets.
- Optimized Graph Queries: Refactored historical data retrieval to group results per-table before unioning, significantly reducing database load times for multi-month timelines.
- Zero-Copy Data Retrieval: Updated database layer to fetch raw timestamps directly, bypassing expensive datetime object instantiation.
- Pandas Removal: Completely removed the
pandasdependency. The application is now lighter and launches significantly closer to instant.
- Memory Leak Fix: Resolved an issue where closing the graph window would leave "ghost" instances running in the background. Windows are now properly destroyed, freeing up system resources.
- Fixed Graph Freeze: Decoupled recursive signal loops that could lock up the interface when switching between long timelines.
- Fixed Missing Plot Lines: Resolved a Matplotlib epoch mismatch that caused data to be rendered thousands of years in the future; transitioned to robust native datetime plotting.
- Background Bandwidth Calculation: Moved heavy statistical summations to the data worker thread, preventing UI lag when calculating totals for massive datasets.
- Fixed "Stuck 0.00 Mbps" Bug (#64): Lowered minimum display threshold to
0.0. Meters now react to even the smallest background transfers (below 80kbps). - Accuracy & Lag Resilience (#78): Fixed timing logic and increased validity thresholds (3s -> 10s) to prevent inaccurate speed drops during minor system lag.
- Vertical Taskbar Support (#77):
- Changed layout to bottom-align the widget on vertical taskbars (placing it near the tray).
- Hardened Z-order preservation to ensure the widget stays on top even when the taskbar is clicked.
- Taskbar Detection Fixes (#75, #76): Added safe screen fallbacks and silenced benign "ambiguous edge" log spam.
- Phantom Speed Spikes: Corrected the rate-limiting math to prevent erratic behavior after system wake or intense jitter.
- Tray Icon Manager: Extracted system tray logic into a dedicated component.
- System Event Handler: Centralized low-level Windows hooks (taskbar detection, fullscreen logic) for improved testability.
- Main Widget Decoupling: Split the monolithic
NetworkSpeedWidgetby extractingStartupManager(registry logic) and enhancingPositionManager(Z-order/window control), significantly reducing code complexity.
- Session View Default: The graph now defaults to the high-resolution "Session" view, ensuring data is visible immediately upon opening.
- Widget Background: Added custom background color and opacity controls.
- Short Unit Labels: Added a toggle for compact unit display (e.g. "Mb" vs "Mbps").
- Precise Thresholds: Replaced sliders with precise
QDoubleSpinBoxinputs (0-10,000 Mbps).
- Optimized Tray Offset: Reduced default tray offset from 10px to 1px, allowing the widget to sit flush against the system tray overflow menu for a cleaner look.
- Layout Stability: Fixed scaling issues and potential crashes (
NameError) during font resizing or unit switching.
- Safe Database Migrations: Replaced the destructive "Drop & Recreate" logic with a safe, versioned migration system.
- New Languages: Added full support for Korean (ko_KR) and Slovenian (sl_SI).
- Key Parity (#74): Backfilled all 9 supported locales to ensure 100% key parity with English, preventing "missing key" crashes.
Original release of the interactive graph overhaul, later designated as Beta due to accuracy and layout regressions reported in high-frequency monitoring scenarios.
- Precision Crosshairs: Added comprehensive dual-axis crosshair system (vertical timestamp snap & horizontal speed tracking).
- Dual-Axis Layout: Split graph into dedicated independently-scaled charts for Download and Upload.
- Smooth Interaction: Switched rendering to an idle-loop model to eliminate UI freezes.
- Fixed Startup Crashes: Solved
AttributeErrorissues related tomatplotlib.dates. - Fixed Widget Disappearance: Resolved regression where closing the Graph window could hide the main widget.
This release addresses a critical bug where the widget would incorrectly hide when applications were maximized, even though the taskbar remained visible.
- Fixed Widget Hiding with Maximized Apps: Resolved issues where the widget would disappear when other applications were maximized.
- The
is_taskbar_obstructedlogic was overly aggressive and incorrectly identified maximized windows as obstructions. - The detection has been simplified: the widget now only hides when a true fullscreen application is running (window dimensions exactly match the monitor).
- Maximized windows, borderless windowed games, and other non-fullscreen scenarios no longer cause the widget to hide.
- The
- Fixed Build Script: Corrected a filename mismatch in
build.batwhere the expected installer filename did not include the-x64suffix, causing builds to fail at the packaging stage.
This release marks a significant maturity milestone for NetSpeedTray. We are proud to announce that the application is now digitally signed, establishing a chain of trust and eliminating security warnings. Additionally, this update brings full Russian language support and a completely modernized, automated build pipeline.
- Digitally Signed Release: NetSpeedTray is now officially signed with a trusted code signing certificate.
- Eliminates the "Unknown Publisher" warning from Windows SmartScreen.
- Guarantees that the executable has not been tampered with since it left the build server.
- Security Patches: Updated critical dependencies (including
fonttoolsandpandas) to the latest secure versions to resolve reported vulnerabilities (CVEs). - Hardened Build Process: Implemented strict input sanitization in the GitHub Actions workflow to prevent script injection attacks.
- Russian Language Support: Added complete translation for the Russian language (Русский).
- Locale Best Practices: Updated the internal localization engine to use native language names (Endonyms) in the settings menu.
- Fully Automated Pipeline: Implemented a robust CI/CD workflow using GitHub Actions. Every release is now built, tested, and packaged in a clean, isolated environment, ensuring 100% reproducibility.
- Automated Versioning: The application version is now dynamically injected from Git tags directly into the executable, installer, and internal metadata. This ensures the "File Version" in Windows Properties always matches the release tag perfectly.
- Quality Gates: Unit tests are now automatically executed before every build. If a test fails, the build is stopped immediately, preventing buggy releases from reaching users.
This is a landmark release focused on stability and making the application's most complex feature—the Network Speed Graph - a fast, and visually insightful tool.
The graph has been completely re-architected for performance and clarity. This update also includes an extensive list of critical bug fixes that address phantom speed spikes, UI glitches, installer problems, and instability when the Windows shell is restarted.
-
Definitive Visualization: The graph has been completely redesigned to solve the core problem of displaying asymmetric network speeds.
- Dual-Axis Layout: The graph is now split into two dedicated, independently-scaled charts for Download and Upload, ensuring that upload activity is always perfectly visible and not "flattened" by large download spikes.
- Hybrid Rendering Engine: The graph uses a smart, hybrid approach for visualization. Short timelines (e.g., "24 Hours") are rendered as detailed line plots, while long timelines (e.g., "Month") are rendered as a beautiful Mean & Range Plot, showing both the daily average trend and the min/max volatility.
-
Massive Performance Improvements: The entire data pipeline is now asynchronous, eliminating UI freezes.
- Instantaneous Loading: The graph window now opens instantly. Data is fetched and processed in a background worker thread, preventing the application from becoming unresponsive when loading large time ranges.
- Responsive UI: Switching between timelines, hovering over the graph, and resizing the window is now dramatically faster and smoother.
-
Full Interactivity & Polish:
- NEW: Fixed Graph Timeline Display: Solved multiple issues with the X-axis, including incorrect time windows being shown and cluttered, nonsensical timestamps. Timelines from 3-24 hours now have clean, sensible tick intervals.
- NEW: Fixed Live Update Initialization: Resolved a bug where the "Live Update" feature in the graph would not work on the first open, requiring the user to toggle it off and on again.
- Fixed "No Data Available" Bug: Resolved a critical bug in the database query logic that could cause the graph to incorrectly show "No data available."
- Accurate Total Bandwidth: Corrected the stats bar logic to ensure "Total" bandwidth calculations are fast and accurate across all timelines.
- Visual Glitch Fixes: Resolved bugs that caused Y-axis labels to appear in black on a dark background or display in scientific notation. Added a separator line for better clarity.
- Definitive Fix for "Phantom" Speed Spikes: Implemented a new multi-stage "re-priming" state to permanently fix the bug where impossible network speeds would be recorded after the computer resumed from sleep or experienced heavy lag. The data collection engine now waits for the network drivers to stabilize before resuming measurements.
- Enhanced Shell & Display Resilience: Fixed major bugs where the widget would disappear or move to the wrong position after
explorer.exewas restarted, a monitor was disconnected (e.g., via a KVM switch), or on some multi-monitor setups. The application is now significantly more robust in detecting and recovering from these events. - Fixed "Zombie" Process Bug: Solved a critical issue where closing the graph window would also incorrectly close the main widget, leaving a lingering "zombie" process running in the background.
- Fixed Start Menu Shortcut: Corrected a bug in the installer that prevented the Start Menu shortcut from being created on a fresh installation.
- Fixed "0 Mbps" Bug: Fixed a logic error that caused the meter to show
0.00 Mbpsfor users with a very fastupdate_rateby making internal timing checks dynamic and more robust. - Fixed UI Glitches:
- Resolved an issue where the widget would incorrectly move position after the user clicked the "Show hidden icons" tray chevron.
- Fixed a visual glitch that could cause duplicated "Apply" and "Cancel" buttons to appear in the settings dialog.
- Comprehensive Code Refactoring: Many internal components were refactored to improve maintainability and performance. This includes centralizing application-wide constants to eliminate "magic numbers" and improve consistency.
- Hardened Test Suite: The project's automated test suite (
pytest) has been significantly expanded and improved, ensuring that all new features and bug fixes are thoroughly validated, leading to a more stable application. - Enhanced Logging Privacy: The logging system's privacy filter has been replaced with a more powerful
ObfuscatingFormatterthat redacts sensitive information (user paths, IP addresses) from the entire log message, including full tracebacks.
This version represents a major leap forward in stability, internationalization, and user control, addressing critical bugs from previous versions and fundamentally improving the application's architecture for future development.
-
Full Internationalization (i18n) Framework:
- The application has been completely re-architected to support multiple languages.
- Modular Language Files: All user-facing strings have been externalized from Python source code (
.py) into language-specific JSON files (locales/*.json). This decouples translation from application logic, making it vastly easier for the community to add new languages or fix typos. - UX Improvement: The language selection menu in the settings now correctly displays language names in their native form (endonyms), such as "Deutsch" instead of "German". This is a global best practice that prevents users from getting "trapped" in a language they cannot read.
-
Overhauled Network Interface Monitoring:
- The ambiguous "Monitor All Interfaces" option has been replaced with a clear, explicit set of four radio-button choices in the settings, giving users full control and transparency.
- New Monitoring Modes:
- Auto (Primary Interface): The smart default that automatically finds the main internet-facing adapter.
- All Physical Interfaces: Aggregates speed from hardware like Wi-Fi and Ethernet while intelligently filtering out virtual adapters (VPNs, VMs) to reduce noise.
- All Interfaces (including virtual): A new power-user option that aggregates traffic from every adapter reported by the system, including VPNs, virtual machines, and system loopbacks.
- Select Specific Interfaces: The existing manual selection mode.
- The core
NetworkControllerlogic was updated to support these new modes, applying the virtual interface exclusion list only when "All Physical" is selected.
-
Definitive Fix for Disappearing/Flickering Widget:
- A fundamental issue in event handling, which caused the widget to disappear when interacting with the desktop, taskbar, or RDP sessions, has been resolved.
- New Architecture: The old, aggressive logic has been replaced with a debounced refresh architecture. The application now uses
WinEventHooklisteners to intelligently wait for system UI events (like window focus changes or resizes) to "settle" before performing a single, authoritative check on the widget's visibility and Z-order. - This resolves all related stability issues, including the widget hiding when right-clicking for a context menu and correctly handles browser fullscreen videos.
-
Database Aggregation Logic:
- Fixed a bug in the SQL
GROUP BYclause for both minute-to-hour and raw-to-minute data aggregation, ensuring that records are correctly combined and preventing duplicate entries in aggregated tables.
- Fixed a bug in the SQL
- Constants Refactoring: All user-facing strings were removed from the
constantsfiles and replaced with non-translatable keys. This improves code clarity and centralizes all text in thelocalesdirectory. - Dependency Injection for i18n: The internationalization object (
i18n) is now properly initialized at the application entry point (monitor.py) and passed down as a dependency to all UI components (widget,settings,graph,renderer) and helper functions (format_speed). - Test Suite Updates: The
pytestunit tests have been updated to reflect all architectural changes, including the new interface monitoring modes and the use of i18n keys, ensuring the application's logic remains sound. - Installer Reliability: The installer continues to gracefully shut down a running instance of the application before updating, preventing common installation errors.
- Improved Decimal Formatting UI: The confusing "Force Decimals" toggle has been removed in favor of a single, intuitive slider that directly controls the number of decimal places (0, 1, or 2), with output now consistently padded with zeros for a more stable appearance.
This is a critical hotfix release that provides a definitive and comprehensive fix for the startup crash and several related stability issues discovered during the beta cycle.
This is a highly recommended update for all users.
- Critical Startup Crash & Systemic Stability Issues: Resolved a complex chain of initialization and rendering errors that caused the application to crash on first launch, particularly on systems with specific UI configurations (like a small taskbar).
- Following user feedback from the beta releases (a huge thank you to GitHub user CMTriX!), a full codebase audit was performed.
- This audit eradicated a systemic typo pattern and fixed numerous latent bugs in the widget rendering, positioning, and various utility modules (
taskbar,network,config). - The result is a stable and reliable experience across a much wider variety of Windows environments.
- Installer Reliability: The installer is now much more robust when updating a running instance of NetSpeedTray. It now attempts a graceful shutdown of the application before proceeding with the update, preventing the "Setup was unable to automatically close all applications" error and ensuring a smoother, more successful update process.
This is an immediate hotfix to address a critical bug in the "Start with Windows" feature introduced in v1.1.3.
- Fixed "Start with Windows" Toggle: Resolved a critical logic flaw where the "Start with Windows" setting could not be disabled. The toggle in the settings window will now correctly reflect the user's saved choice, and disabling the feature now correctly removes the application's entry from the Windows Registry.
This is an urgent hotfix release that addresses a critical startup crash reported by users after the v1.1.2 update. It also restores and improves the widget's positioning stability, resolving several visual regressions.
- Fixed Critical Startup Crash: Resolved a critical
AttributeErrorthat prevented the application from launching on some systems. This was caused by an unreliable network dependency (netifaces) which has now been completely removed and replaced with a more robust, built-in solution. - Restored Widget Stability (Fixed Flashing): Re-engineered the widget's core update logic to eliminate a visual "flashing" regression introduced in v1.1.2. The widget is now perfectly stable and only updates its position when absolutely necessary, removing all polling-related flicker.
- Improved UI Responsiveness: Fixed two key regressions where the widget would not:
- Reliably reappear after launching an application (like Calculator) from the Start Menu.
- Automatically reposition itself when new icons appeared in the system tray.
This is a major stability and quality-of-life release that addresses critical bugs, enhances UI intelligence, improves user privacy, and completely overhauls the installer and settings backend for a more professional and robust user experience.
-
Intelligent Interface Monitoring (New Default): The method for selecting network interfaces has been completely redesigned for clarity and accuracy.
- It now uses a clear, three-option radio button system:
All,Auto, andSelected. - "Auto (Primary)" is the new default mode. It intelligently identifies your main internet adapter, providing a much more accurate speed reading by ignoring noise from VPNs, virtual machines, and other virtual adapters.
- It now uses a clear, three-option radio button system:
-
Language Selection: The application is now fully internationalized. Users can select their preferred language from a new dropdown in the General settings. A restart is required for the change to take full effect.
-
Intelligent Taskbar Positioning: The widget's positioning logic has been completely re-architected. It now actively scans the taskbar for "obstacles" like the Start Menu, pinned application icons, and the Windows Weather/Widgets icon. It intelligently places itself in the nearest truly empty space, preventing it from overlapping with other UI elements.
-
Adaptive Layout for Small Taskbars: The widget now automatically detects when Windows' "Use small taskbar buttons" setting is active and switches to a clean, compact, single-line horizontal layout for a much better visual fit.
- Fixed "Auto" Interface Monitoring: Fixed a critical bug where the "Auto" mode logic existed but was never actually called, making the feature non-functional. The controller now correctly uses this logic when the "Auto" mode is selected.
- Fixed Phantom Speed Spikes (Data Integrity): Resolved a critical bug where waking the computer from sleep could cause the application to calculate and save impossibly high network speeds. The data collection logic is now more robust and includes multiple sanity checks to discard these "phantom" spikes.
- Fixed "Invisible Shield" & RDP Bugs (UI Stability): Resolved a severe bug where the widget could act as an "invisible shield," blocking mouse clicks to other applications. The widget's transparent areas are now correctly "click-through" by default. This also resolves related stability issues for users in Remote Desktop (RDP) sessions.
- Fixed Graph Window Accuracy (Live Data): Corrected a bug in the Graph Window where selecting a specific network interface would still display the total speed of all interfaces in "Live Update" mode. The graph now correctly displays only the selected interface's data.
- Fixed Settings Window Stability: The Settings window has been re-engineered to be a normal, non-modal window. This fixes numerous UI bugs, including dropdown menus instantly closing and the entire application shutting down when the settings window was closed.
- Fixed Interface Selection Logic: Corrected a logic flaw where monitoring would fall back to all interfaces if the "Selected" option was chosen but no interfaces were checked. It now correctly shows zero speed.
- Database & Data Integrity:
- Fixed a bug where negligible, sub-byte network speeds were being incorrectly saved to the database.
- Resolved a
KeyErrorcrash that could occur during application shutdown due to a race condition in the timer management system.
- UI & Visual Polish:
- The mini-graph on the widget now has dynamic Y-axis padding, preventing graph peaks from being "cut off".
- Fixed inconsistent decimal formatting for download speeds.
- Installer Overhaul: The Inno Setup installer and uninstaller have been significantly improved:
- Correct 64-bit Installation: Ensured the installer correctly recognizes the application as 64-bit, defaulting to the native
C:\Program Filesdirectory instead ofC:\Program Files (x86). - The uninstaller now reliably detects if the application is running and will prompt the user to close it before proceeding.
- The uninstaller now provides a clear option to completely remove all personal data (settings, database, logs).
- Fixed a bug where the desktop shortcut was sometimes left behind after uninstallation.
- Silent Uninstall with Data Removal: For a complete, unattended removal, run the following command in an Administrator PowerShell:
& "C:\Program Files\NetSpeedTray\unins000.exe" /SILENT /PURGE=true
- Correct 64-bit Installation: Ensured the installer correctly recognizes the application as 64-bit, defaulting to the native
- Log File Privacy (Verified): The privacy filter is now fully effective. It automatically obfuscates personal information before it is written to the log file.
- User home directories in file paths are replaced (e.g.,
C:\Users\Erez\...becomes<USER_HOME>\...). - IP addresses found in rare error messages are partially redacted (e.g.,
192.168.1.100becomes192.168.x.x).
- User home directories in file paths are replaced (e.g.,
This release focuses on providing a fast, and native-feeling user experience as much as possible. It introduces a major startup performance overhaul, addresses key bugs related to the history graph and UI integration, and refines the application's overall stability.
- Drastically Improved Startup Performance: The application's compiled structure has been changed to eliminate the slow, single-file unpacking process.
- Faster Launch: Startup time is now significantly faster, as the application and its dependencies are no longer extracted to a temporary folder on every launch.
- New Distribution Formats: To support this, NetSpeedTray is now distributed with a fast Inno Setup installer and a portable
.ziparchive for users who prefer a non-install option.
- Seamless UI Responsiveness & Integration: The widget's visibility logic is now fully event-driven, eliminating delays and making it feel like a native part of the Windows shell.
- Instantaneous Auto-Hide & Fullscreen Detection: The widget now appears and disappears instantly with an auto-hiding taskbar and when entering or exiting fullscreen applications.
- Graceful System UI Handling: Proactively hides when core system menus (like the Start Menu and network/volume flyouts) are opened, and reappears upon closing them. This provides a polished, non-intrusive experience and avoids visual glitches.
- Reliable Z-Order: The widget now correctly stays on top of the taskbar and other applications after focus changes.
- Smart Taskbar Theme Detection: Fixed a critical bug where the widget's text color would be incorrect for users with a "mixed theme" (e.g., Light app mode with a Dark taskbar). The widget now correctly bases its text color on the taskbar's theme, ensuring visibility in all configurations.
- Graph Window Polish:
- Timeline Persistence: The graph window now correctly remembers and restores the last selected time range (e.g., "6 Hours", "1 Day") across application restarts.
- Corrected Data Display: Fixed a bug where the graph would show "No data available" for long-term views on a fresh launch; it now correctly displays all available historical data.
- UI Visibility with Start Menu: Resolved a regression where the widget would not reappear after launching an application (like Calculator or Settings) from the Start Menu.
- Light Mode Stability:
- Fixed a crash that occurred when opening the Settings dialog in Windows Light Mode.
- Resolved the "invisible text" bug on the very first launch for users in Light Mode.
- Architectural Improvements:
- The
WinEventHookutility has been upgraded to be more robust and efficient. - The core visibility logic in
taskbar_utils.pyhas been significantly improved to handle edge cases more reliably. - The build process now performs a full cleanup, leaving no intermediate files behind.
- The
This is a significant update focused on improving data accuracy, providing more detailed graphing features, and creating a more stable foundation for the future. The data collection and storage pipeline has been substantially rebuilt to make NetSpeedTray a more capable and reliable network monitor.
- Intelligent Graph Visualization: The history graph is now significantly more insightful and readable.
- Dynamic Logarithmic Scale: A new
symlogscale solves the "flat line" problem, allowing you to see fine-grained detail in your low-speed traffic without high-speed spikes squashing the visualization. - Smart Axis Boundaries: The Y-axis scale is now data-driven, analyzing your traffic patterns to set a "normal usage" range that ensures the graph is always well-suited to your network.
- Clean, Readable Ticks: The Y-axis labels are now always round numbers (e.g., 0, 10, 100, 1000), making the graph intuitive and easy to read.
- Dynamic Logarithmic Scale: A new
- Smart Interface Monitoring: The application can now automatically identify your primary internet connection (e.g., "Wi-Fi" or "Ethernet") and display its speed by default, providing a cleaner and more accurate reading.
- Per-Interface Graph Filtering: A new "Interface" dropdown in the graph settings allows you to visualize the speed history for any specific network adapter on your system.
- Improved Data Accuracy:
- Fixed a bug that could cause large, incorrect speed spikes in the database after the computer wakes from sleep. The controller now handles these events correctly, ensuring historical data is more reliable.
- Safer Data Retention Policy: If you reduce the data retention time (e.g., from 1 year to 7 days), the application now waits for a 48-hour grace period before pruning old data, preventing accidental data loss.
- Added full German (de_DE) language support. Many thanks to the users and communities on Chip.de and Softpedia for their attention and support.
- Architectural Overhaul:
- The core data layer (
WidgetState) has been rebuilt with a multi-tiered database (raw,minute,hour) and a dedicated worker thread to improve UI responsiveness. - The
Controllerhas been updated to support granular, per-interface data collection. - The application's constants have been refactored into a more organized package structure.
- The core data layer (
- Performance: Key libraries like
numpyandmatplotlibare now lazy-loaded, making the initial application startup faster and more lightweight. - Graphing Engine:
- The "Session" view now correctly uses live in-memory data.
- The
Export to CSVfeature now exports the currently filtered view.
- Technical Debt: The obsolete
core/model.pymodule has been removed, simplifying the codebase.
- This version introduces a new database format to enable per-interface monitoring and improved accuracy.
- The upgrade is automatic and safe. When you first run v1.1.0, the application will detect the old database, back it up by renaming it to
speed_history.db.old, and create a new one. No manual steps are required.
This is a major stability, performance, and quality-of-life update focused on refining the widget's core behavior, improving data accuracy, and optimizing the application's architecture for future features.
-
** Improved Widget Stability & Behavior:** The widget now feels much more like a native part of the Windows taskbar. An entirely new, event-driven architecture (using a WinEventHook and a safety-net timer) has been implemented to intelligently manage visibility. The widget no longer flickers, disappears, or gets stuck behind the taskbar when interacting with the Calendar, Network/Volume flyouts, or the tray overflow menu.
-
Enhanced Startup Performance: The application's impact on system startup has been reduced. By implementing "lazy loading" for the graph window and other UI components, the initial launch is now faster and lighter on system resources.
- Graphing Engine Overhaul: The graph window's data pipeline has been completely revised for accuracy and reliability.
- Fixed a critical bug that caused the graph to appear flat-lined or empty due to a data unit mismatch in the database.
- Corrected the "Total" data calculation in the stats bar, which was showing vastly inflated numbers.
- Fixed an issue where the "Live Update" toggle was not updating the graph in real-time.
- Accurate Speed Calculation: Resolved a bug where network speeds could show an incorrect, massive spike after the computer wakes from sleep or hibernation.
- Application Stability:
- Fixed a potential crash (
AttributeError) that could occur when closing the application. - Hardened the DPI detection logic to prevent log spam and errors from invalid monitor handles reported by the OS.
- Fixed a potential crash (
- Code Quality & Architecture:
- The core data management model has been centralized into a single
WidgetStateclass, improving clarity and retiring the redundantSpeedHistoryclass. - The developer console is now clean, with benign
matplotlibwarnings on first launch being properly handled. - Numerous unused imports and obsolete code paths have been removed.
- The core data management model has been centralized into a single
- To enable the data accuracy fixes, users upgrading from a previous version must delete their old history database. A new, clean database will be created automatically.
- Instructions:
- Ensure NetSpeedTray is not running.
- Open File Explorer, paste
%APPDATA%\NetSpeedTrayinto the address bar, and press Enter. - Delete the file named
speed_history.db.
This release focuses on improving the reliability and accuracy of the Network Speed Graph, resolving all known bugs related to data display and state persistence.
- Accurate "System Uptime" Timeline: The "System Uptime" view now correctly uses the system's actual boot time as its starting point, perfectly matching the behavior of the Windows Task Manager.
- Correct "Session" Timeline: The "Session" view is now persistent and correctly displays data from the start of the application, regardless of how many times the graph window is opened or closed.
- Accurate Statistics Bar: The "Max" and "Total" statistics displayed at the top of the graph are now always calculated correctly based on the selected timeline, ensuring you see the right data for the right period.
- Improved Initial Load: Fixed a bug where the graph would sometimes show "No data available" on its first launch, even when historical data was present. It now reliably displays the correct timeline from the moment it opens.
- Build Process: The build script has been made more robust.
- Configuration: The application's configuration file now officially recognizes and validates all graph-related settings, eliminating harmless but noisy warning messages from the log files.
This is a landmark stability release that perfects the core user experience of the widget. Through a comprehensive overhaul of the positioning and state management logic, the widget now behaves with the rock-solid predictability of a native Windows UI element. All visual "flickering," "jumping," and "drifting" issues have been eliminated.
- Perfectly Stable Positioning: Resolved a complex series of deep-seated bugs that caused the widget to flicker or jump. The widget's position is now completely stable during application startup, after closing the settings window, and while the system tray icons change.
- Smooth & Intuitive Dragging: The widget no longer "fights" the user's cursor or snaps to a slightly different spot after being moved. The position where you release the mouse is now its final, pixel-perfect location.
- Intelligent Snap-to-Edge: When dragging the widget near the system tray, it now intelligently snaps to a minimum safe distance if moved too far, gracefully respecting the user's intent to place it as close as possible.
- Unrestricted Placement: The arbitrary limit on how far the widget could be dragged along the taskbar has been removed. Placement is now constrained only by the edges of your screen.
- Graph Window: Fixed a critical
AttributeErrorthat could prevent the Graph Window from opening correctly. - Configuration File: The app's config file is now cleaner and no longer stores unnecessary
position_xandposition_yfields when they are not in use. - UI Text: The "Enable Free Move" label in settings has been simplified to "Free Move (No Snapping)" for better clarity.
This release focused on quality-of-life improvements, introducing the initial version of the adaptive widget positioning and overhauling the installation process for seamless future updates.
- Adaptive Positioning (Beta):
- The widget now learns and maintains your preferred distance from the system tray.
- It automatically shifts its position to prevent being overlapped by new application icons appearing in the tray.
- Your custom spacing is "learned" simply by dragging the widget while Free Move is disabled.
- Seamless Upgrades & WinGet Compatibility: The Windows installer has been overhauled. It now correctly replaces the previous version's files, ensuring a clean and reliable upgrade experience. This change also prepares the application for distribution via the Windows Package Manager (WinGet).
- UI Clarity: Renamed the confusing "Smart Threshold" toggle to "Dynamic Update Rate" to more accurately describe its power-saving function.
- User-Friendly File Naming: The configuration and log files have been renamed to be more descriptive (
NetSpeedTray_Config.jsonandNetSpeedTray_Log.log), making them easier for users to identify.
-
Free Move is Here!
- You can now unlock the widget from the taskbar and place it anywhere on your screen.
- The widget's position is automatically saved when Free Move is enabled and it reliably snaps back to its default location when disabled.
-
Total Control Over Speed Units:
- A new Speed Units panel has been added to the settings for granular control over the text display.
- Display Mode: Choose between 'Auto' scaling (bps, Kbps, Mbps) and 'Always Mbps'.
- Decimal Places: Set the speed value precision from 0 to 2 decimal places.
- Text Alignment: Align the speed text left, center, or right within the widget.
- Force Decimals: A new option to always show decimal points (e.g.,
5.0instead of5).
- Smarter Installer: The Windows installer now automatically replaces the old executable, ensuring a clean and seamless upgrade experience. Old version files are removed.
- Improved Configuration: The configuration file has been renamed to
NetSpeedTray_Config.jsonfor clarity. The management system is now more robust, preventing settings from being accidentally discarded. - Cleaner Log Files: The log file has been unified and renamed to
NetSpeedTray_Log.logto make troubleshooting easier. - Accurate Graph Stats: The statistics in the main graph's status bar are now calculated correctly for all timelines, including "All".
- CRITICAL: Mini-Graph Now Renders Correctly: Fixed a series of silent failures that were preventing the mini-graph from appearing on the widget. This was the most significant bug from the beta and is now fully resolved.
- CRITICAL: State Persistence Fixed: Resolved a major bug where toggle states (like Free Move, Force Decimals, and Start with Windows) were not being saved correctly across application restarts.
- "Snap-Back" Bug Fixed: Corrected a state management flaw where disabling "Free Move" sometimes required clicking "Save" twice. The widget now snaps back to its default position instantly and reliably on the first click.
This release introduces powerful new customization features for the taskbar widget and resolves a series of critical bugs that were discovered following the major refactor in Beta1.
-
Free Move Feature:
- Introduced the Free Move feature, allowing users to unlock the widget from the taskbar and place it anywhere on the screen.
- The widget's position is now saved when Free Move is enabled and it automatically and reliably snaps back to its default location when disabled.
-
Speed Units Customization:
- Added a new Speed Units section to the settings for granular control over the text display.
- Speed Display Mode: Choose between 'Auto' scaling (bps/Kbps/Mbps) and 'Always Mbps'.
- Decimal Places: Set the precision of the speed values (0, 1, or 2).
- Text Alignment: Align the speed text to the left, center, or right of the widget.
- Force Decimals: An option to always show decimal points (e.g., '5.0' or '5.00' instead of '5').
- Speed Unit Logic: The old 'Use MB/s' toggle has been removed and replaced by the more flexible and powerful Speed Display Mode.
- Configuration Management: Refactored the
ConfigManagerto be more robust and declarative, preventing future issues with unsaved settings. - Data Flow: Streamlined the data pipeline between the widget and the renderer to prevent data corruption and improve stability.
- Main Graph Stats: Improved the accuracy of the main graph's status bar; statistics for the 'All' timeline are now calculated correctly.
- Mini-Graph Rendering: Fixed a critical bug where the Mini-Graph would not render on the widget. This was caused by a series of silent failures, including a
NameError, a data corruption issue in the renderer's data flow, and an incorrect drawing call. - State Persistence:
- Resolved an issue where the 'toggle states were not being saved across application restarts.
- Fixed a state management bug that required clicking 'Save' twice to disable Free Move; the widget now snaps back instantly.
- Settings Not Saving: Corrected a validation issue that prevented several settings (
force_decimals,start_with_windows, etc.) from being saved to the configuration file.
- Full Modular Refactor:
Migrated from a single-file script to a modern, maintainable package structure (src/netspeedtray/). All logic is now organized intocore,views,utils,constants, andtestsmodules.
- Modern UI/UX:
- Redesigned settings and graph windows with PyQt6, custom dark mode and improved layout.
- Hamburger menu for quick access to graph settings.
- New icons and centralized asset management.
- Testing:
- Added unit tests for configuration, constants, and core logic.
- Code Quality:
- Improved type hints, docstrings, and error handling throughout.
- Enhanced logging and configuration management.
- User Experience:
- Graph and settings dialogs now always open centered and within screen bounds.
- Stability & Layout:
- Fixed window icon issues and theme inconsistencies.
- Improved error overlays and ensured dialogs respect minimum sizes and DPI scaling.
- App Usage Tab: Temporarily disabled pending further development.
- Multi-Monitor: Still limited to primary taskbar’s screen; multi-monitor support improvements planned.
- Double-Click Full Graph:
- Double-clicking the widget now opens the detailed
GraphWindowfor network speed history.
- Double-clicking the widget now opens the detailed
- GraphWindow Features:
- Live Updates: Toggleable real-time updates (2-second interval).
- Dark Mode: Switch between light and dark themes for better visibility.
- Legend Positioning: Options include Off, Left, Middle, Right.
- Export Options: Save graph as PNG or history as CSV.
- History Periods: Select from Session, 24h, 1 Week, 1 Month, All, or System Uptime.
- Data Retention: Configurable retention periods (1 day to 1 year).
- Settings Dialog Enhancements:
- Replaced checkboxes with modern
ToggleSwitchcontrols for a cleaner UI. - Added live preview for font size and weight adjustments.
- Improved network interface selection with a scrollable list and "All Interfaces" toggle.
- Replaced checkboxes with modern
- UI Improvements:
- Modernized
SettingsDialogwith toggle switches and better layout spacing. - Increased
GraphWindowdefault size to 802x602 pixels for improved readability. - Enhanced mini-graph rendering with configurable opacity.
- Modernized
- Performance:
- Throttled
GraphWindowupdates to 500ms intervals to reduce UI lag.
- Throttled
- Configuration:
- Updated default font to "Segoe UI Variable Small" for consistency.
- Stability:
- Improved error handling in
GraphWindowand CSV logging with thread-safe locking.
- Improved error handling in
- Layout:
- Ensured dialogs (Settings, Graph) stay within screen bounds and anchor correctly relative to the widget.
- Visibility:
- Refined fullscreen app detection to prevent widget hiding issues.
- Multi-Monitor: Limited to the primary taskbar’s screen; doesn’t fully support multiple taskbars or dynamic monitor changes without manual repositioning.
- High-Frequency Updates: May still impact performance on low-end systems despite throttling.
- False Flagging - VirusTotal report
- Startup Positioning Issue: Resolved the issue where the
Widgetjumps to the top-left corner on startup after login, ensuring it maintains its exact saved position immediately. - Desktop Click Hiding/Flashing: Fixed the issue where clicking the desktop causes the widget to hide and "flash", improving fullscreen detection and adding debouncing to prevent rapid visibility toggles.
- Portable Startup Issue: Fixed the "Start with Windows" option in the portable version, ensuring it creates a shortcut in the Startup folder for automatic launch on login, matching installed version behavior (requires
pywin32for shortcut creation).
- Improved Widget Visibility and Z-Order Management
- Enhanced the widget’s visibility handling to ensure the widget remains visible across window switches and taskbar interactions.
- Optimized Settings Dialog Positioning
- Streamlined the positioning of the settings dialog to use Qt’s screen geometry, ensuring it remains fully visible above the taskbar in multi-monitor setups, with better handling of size changes after saving settings.
-
Start Menu Interaction Issue
- The
Widgetmay hide or become unresponsive when the Windows Start menu is opened, This issue arises due to a Windows limitation whereShell_TrayWnd(the taskbar window) and related UI elements (e.g., Start menu) can obscure or temporarily disable overlay windows - like the widget. - Windows does not provide a reliable API or event to distinguish Start menu activation from other fullscreen or taskbar-related states, leading to potential misdetection in
is_fullscreen_app_activeorcheck_and_update. This behavior is outside NetSpeedTray’s control but may be mitigated in future updates by enhancing taskbar and Start menu state tracking. - What this all means to the avarage user - when clicking on the start menu, the widget 'hides' and when clicking anywhere other than the taskbar, it will reappear
- The
-
Enhanced Position Persistence
- Modified
NetworkSpeedWidget.initialize_with_saved_positionanduse_saved_positionto prioritize loading and applying the last saved position (position_x,position_y) fromnetspeedtray.confon startup, ensuring the widget appears exactly where the user left it after each Windows logon. - Updated
update_positionto check for theinitial_position_setflag and saved coordinates, defaulting to the last saved position unless explicitly overridden by dragging or major failures. - Improved error handling in
use_saved_positionandupdate_positionto only fall back to position (100, 100) if there’s a critical failure (e.g.,taskbar_hwndor screen geometry cannot be detected). This prevents unnecessary repositioning to the top-left corner.
- Modified
-
"Flashing" Prevention:
- Delayed widget visibility (
self.show()) untilinitialize_with_saved_positionconfirms the correct position, avoiding premature display in the wrong location. This eliminates the "flashing" by ensuring smooth positioning before rendering. - Added logging in
initialize_with_saved_positionanduse_saved_positionto debug positioning issues, ensuring visibility of any errors causing the "flash" or incorrect placement.
- Delayed widget visibility (
-
Configuration Validation:
- Enhanced
load_configandvalidate_configto ensureposition_xandposition_yare integers and within valid screen bounds, preventing corrupted or invalid position data from causing positioning errors.
- Enhanced
- Startup Synchronization Added command-line arguments (
--set-startup,--unset-startup) to sync "Start with Windows" between the installer and app settings.
- Invisible Widget Issue: Resolved the issue where the app runs but the
Widgetremains invisible, ensuring proper display on the taskbar after launch, even after system restarts or environment changes (e.g., multi-monitor setups, fullscreen apps). - Dragging Error: -Fixed and improving mouse event handling.
- Multi-Monitor Support
- Supports multi-monitor setups by detecting the taskbar screen, but may experience positioning or sizing issues if monitors have different DPI scaling levels (e.g., 125%, 150%, 200%, 300%).
- Handles resolution mismatches between monitors, but scaling mismatches can cause issues.
- KVM Switches
- Should return to the correct position after switching via a KVM, but temporary mispositioning or scaling issues may occur if the new monitor setup differs (resolution, scaling, taskbar position).
- Start Menu Interaction Issue
- The
Widgetmay hide or become unresponsive when the Windows Start menu is opened, particularly on multi-monitor setups or with custom taskbar configurations. This issue arises due to a Windows limitation whereShell_TrayWnd(the taskbar window) and related UI elements (e.g., Start menu) can obscure or temporarily disable overlay windows like the widget. - Windows does not provide a reliable API or event to distinguish Start menu activation from other fullscreen or taskbar-related states, leading to potential misdetection in
is_fullscreen_app_activeorcheck_and_update. This behavior is outside NetSpeedTray’s control but may be mitigated in future updates by enhancing taskbar and Start menu state tracking. - Functionally - when clicking on the start menu, the widget 'hides' and when clicking anywhere but on the taskbar, it will reappear
- The
- Edge Cases:
- Multiple or docked taskbars, monitor hot-plugging, high DPI scaling on small monitors, fullscreen apps on non-taskbar monitors, low-performance systems, KVM switches to non-Windows OS, and custom taskbar positions may cause issues or misbehavior.
- Enhanced multi-monitor support with per-monitor DPI scaling awareness.
- Robust handling of KVM switches, monitor hot-plugging, and custom taskbar positions.
- Performance optimizations for low-end systems.
- Network interface selection feature:
- Interface monitoring modes (All / Selected / Exclude)
- Dynamic detection and status of active interfaces
- Per-interface bandwidth monitoring
- Interface selection persists between sessions
- Enhanced error logging system:
- Detailed error reporting with system information
- Error log rotation (10MB limit, 3 files)
- Error log export functionality in settings
- Comprehensive system diagnostics in logs
- Settings dialog improvements:
- Streamlined layout and organization
- Smart collapsible sections
- Dynamic position adjustment
- Improved interface selection controls
- Default speed thresholds adjusted:
- High speed threshold: 5 Mbps (was 1 Mbps)
- Low speed threshold: 1 Mbps (was 0.1 Mbps)
- Settings dialog now properly shows the application icon in the title bar.
- Application visibility now properly syncs with taskbar:
- Widget auto-hides when taskbar is hidden (fullscreen mode).
- Settings dialog behavior:
- Proper expand/collapse animation
- Maintains screen position when expanding
- Consistent spacing and alignment
- Better visual hierarchy
- Initial release
- Real-time network speed monitoring in system tray
- Upload and download speed display
- Customizable color coding based on speed thresholds
- Optional speed history graph
- Drag-and-drop positioning
- Settings dialog with:
- Update rate configuration
- Color coding options
- Graph settings
- Auto-start with Windows
- Portable and installer versions
- Windows taskbar integration
- System tray context menu
- Configuration file saving/loading
- Error logging system
- Two processes appearing in Task Manager
- Startup delay when loading application
- Application does not reappear when the taskbar auto-hides