Repository navigation
Pulse v1.3.0
Per-core bars and which process runs on which core, lighter sensors (NVIDIA read with NVML), a RAM composition bar, network throughput that finally reads right, restarts after a crash or a display driver change, corner and fit buttons, English only, and administrator rights right after installing or updating.
Download Setup-Pulse-v1.3.0.exe (installer) or Pulse-v1.3.0-portable.zip; both need the .NET 9 Desktop Runtime. Installing over an earlier version keeps your settings and the options you chose; with Start with administrator privileges the logon task is registered again, without the old 72-hour limit.
This is the first published release after 1.1.0: it also includes 1.2.0, the move to the Reticle UI with Mica instead of a layered window (see CHANGELOG.md).
Added
-
Corner button in the header, next to the pin (Reticle's four corner ticks): a click opens four arrows that slide out towards their corners (
motion.reveal, no motion when Windows animations are off), and the chosen one sends the widget to that corner of the screen it is on. It stays inside the work area, so never over the taskbar, 12 units (Reticle space S3) from both edges, the same margin as the first-run position. Esc, a click elsewhere or leaving the widget closes the arrows. -
Fit button in the header, next to the corner button: the widget takes the smallest size that shows everything. The height is exactly the content (no scroll bar, no empty space at the bottom); the width is the narrowest where no value is cut, measured with each value at its longest text (999.9 MB/s, 99 days of uptime, 100 %), so a fit taken at low traffic or right after startup doesn't cut anything later, and with the graphs at their minimum width. A widget on the right or bottom edge of the screen stays there, and inside the work area. Checked from four starting sizes: always 446 × 557 on the reference PC with the English texts, no scroll bar, and 3 px less already scrolls.
-
Per-core load under the CPU graph: one bar per logical processor, filling from the bottom, the threads of one physical core side by side and a small gap between cores, so one busy thread (one full bar) and parallel work (many medium bars) look different even when the total CPU % is the same. On the left, the load counted in full cores ("≈ 5.3 cores in use", the sum of the per-core loads). One
NtQuerySystemInformation(SystemProcessorPerformanceInformation) call per second reads every core; which threads share a physical core comes once at startup fromGetLogicalProcessorInformationEx. The space above and below the ruler before Top CPU / Top RAM went from 12 to 8, so the widget grows 8 units, not a full row. -
Which process runs on which core (Pulse running as administrator): the processes of Top CPU that use at least half a core, up to three, get a colour each (a small square next to the name, kept until the process drops below a quarter of a core) and every core bar is split into layers: from the bottom the share of each of them in its colour, the rest in the CPU colour. The row tooltip gives the same load in cores. Windows has no cheap call for "which process is on which core", so Pulse asks the kernel to sample, on every logical processor, the thread that is running: an ETW system-logger session with
SampledProfileevents every 10 ms (100 per second per core, instead of Windows' default 1 000) and the thread events to map threads to processes; the shares cover the last two seconds. The session is open only while there is a process to colour: with the PC idle there is none, so nothing is sampled. Without elevation the session is denied and the bars stay one colour, and the tooltip says why.PULSE_NO_CORE_SAMPLING=1turns it off. Measured cost with the session open, PC idle, sampling on and off alternated: Pulse 3.30% of one core with it, 3.34% without, private memory +1 MB. -
Restart after a crash: a new installer option, ticked by default, registers the Scheduled Task Pulse restart, which starts Pulse again ten seconds after Windows logs a crash of
Pulse.exe(Application Error 1000, written even with Windows Error Reporting off), with the rights Pulse normally starts with. Pulse refuses a fourth restart within ten minutes, so a crash at startup doesn't loop. -
Display driver changes: when a display adapter goes away or comes back (a driver update, also from Windows Update, or a reset), Pulse stops reading the sensors at once and restarts itself five seconds later, with the same rights. On 10/10/2026 an NVIDIA driver update crashed a running Pulse four seconds after the update, inside LibreHardwareMonitor's NVML call.
-
Administrator rights right after installing or updating: with Start with administrator privileges, a Pulse started without the rights (the launch at the end of the installer, which Inno Setup runs as a normal user even from an elevated setup, the Start menu, the desktop icon) starts the installer's Pulse task, which has the highest privileges and asks for no UAC, and closes: the elevated Pulse is up in about a second. Before, Pulse ran without the rights until the next logon. It happens only when everything matches (an administrator with UAC, the task enabled, with the highest privileges, for the same user and starting this very
Pulse.exe) and at most once a minute; if no elevated Pulse shows up within 10 seconds, the first one carries on as before.PULSE_NO_ADMIN_START=1turns it off.
Changed
- English only: every text of the widget, its tooltips, the tray and process menus and the dialogs is in English, and so are the numbers (decimal point: "5.0%", "13.3 MB/s"), the installer (one language) and the task descriptions. The internal arguments follow (
--restart,--after-crash,--appearance, with--aspettokept as an alias). So is the Appearance... window, which comes from Reticle: Reticle 0.6.1 gives it English texts. netshonly on Wi-Fi: the Wi-Fi name and signal came from anetsh wlan show interfacesstarted every 8 seconds even on a cable (31 ms of CPU each, 450 processes an hour for Defender to scan). It now runs only when the active connection is Wi-Fi, every 30 seconds.- NVIDIA GPUs read directly with NVML: the six values the widget shows (load, temperature, core and memory clock, power, VRAM) come from the NVIDIA driver's own library instead of LibreHardwareMonitor's 41 sensors. A sensor read went from 84 ms (22 ms of CPU) every two seconds to 4.8 ms (1 ms of CPU) on the reference RTX 5070 Ti, with the same values. LibreHardwareMonitor still chooses the GPU to show, reads AMD and Intel GPUs, and takes over again on any NVML problem or with
PULSE_NO_NVML=1. GPUs that are not shown (an integrated GPU next to a discrete one) are no longer read. - RAM explained with a bar: the detail line of abbreviations ("Totale • Disp • Cache • Commit • PF") becomes, like the CPU one, the available memory on the left ("45.1 GB available") and under the graph the composition bar of Task Manager: in use, modified, cached (standby: kept ready, given back as soon as a program needs it) and free, in the RAM violet at decreasing strength. The tooltip explains each part and adds committed memory and page file usage. The memory lists come from
NtQuerySystemInformation(SystemMemoryListInformation), readable without elevation; the widget keeps its height. - Reticle 0.6.1 (from 0.5.0): since 0.6.0
ReticleWindowno longer uses WPF'sWindowChromeand answersWM_NCCALCSIZEandWM_NCHITTESTitself, the change that on Reticle's other adopters removed a full-window composition at every frame. The widget behaves as before: no caption drag area (ShowCaption="False"), the same 6-unit resize borders. 0.6.1 adds the English texts of the Appearance page (TextLanguage="English").
Fixed
- Network throughput always read 0 (since v1.1.0, when
GetIfTable2replaced the performance counters): the interface row was declared with ANSI strings, 864 bytes instead of 1352, so every row and field was read in the wrong place. It is now read at its real offsets, and only the physical adapters count: summing every interface that is up would have counted the same traffic four times on the reference PC, through the WFP and QoS filter interfaces of the same Ethernet card. Checked against Windows' own counters during a download: 13.31 against 13.36 MB/s. - The PC power estimate in the header was about 50 W too high on the reference Ryzen: the GPU total also added the integrated GPU's power sensor, 53 W at idle, far more than its graphics draw and overlapping the CPU package power already counted. Only the GPU shown counts now.
- The administrator Scheduled Task stopped Pulse after 72 hours: created with
schtasks, it kept the Task Scheduler defaults (72-hour limit, no start on battery, stop when unplugged). It now comes from a template with no limit that runs on battery too; reinstall to replace it. - Start with administrator privileges did nothing with Install for me only, the installer's default mode: without administrator rights Windows refuses to register a task with the highest privileges (access denied), the installer ignored the refusal, and no logon task was created, nor the restart task in its elevated form. The script that registers the tasks now asks for elevation when Windows refuses, once for both tasks; the same happens when a reinstall overwrites tasks registered elevated. In that mode the uninstaller asks for elevation too, once, since Windows also refuses to delete those tasks without it. Checked on test tasks from a non-elevated Windows PowerShell, as the installer runs it: one UAC prompt registered both, another overwrote an elevated task, a third deleted both with the uninstaller's command.
- An installer option unticked in an update kept acting: unticking Start with administrator privileges or Restart Pulse if it closes because of an error left the Scheduled Task an earlier install had registered, so Pulse still started elevated at logon (and, with the hand-off above, at every start) or still came back after a crash. The installer now removes the task of an unticked option: nothing happens if there is none, and a UAC prompt comes only for a for me only install whose task was registered elevated. Start with Windows is left alone, since the tray menu sets it too. Checked on test tasks: missing tasks and non-elevated ones went with no prompt, two elevated ones with one.
- Restart as administrator could start the elevated Pulse while the old one was still running, and the new one quit at once: it now waits for the old one to close.
- A second Pulse crashed on its way out: launched while another one ran, it quit as it should but released the single-instance mutex it didn't own, an unhandled exception logged as an application crash. Harmless until now; with the restart task it would have started a crash every 20 seconds.
- Page file usage: it read 100% on machines with much more RAM than page file, because it was estimated as committed memory minus RAM in use. It now comes from the page files themselves (
SystemPageFileInformation): on the reference PC 0.12 of 4.0 GB, where the old line said "PF 100%".
Performance (Ryzen 9 7950X reference, PC idle, same 622 × 502 window, v1.2.0 vs v1.3.0 alternated in two 45 s rounds on 11/10/2026, not elevated)
- CPU with the widget visible: 2.50% → 2.10% of one core; hidden in the tray: 2.65% → 1.53%. Hidden, the widget draws nothing and the figure is the data collection alone: NVML instead of LibreHardwareMonitor for the NVIDIA (22 → 1 ms of CPU every two seconds) and no reads of the GPU not shown. With the widget visible part of the saving goes to the new core and memory bars.
- Compositor (dwm) with the widget visible: CPU 6.6% → 2.5%, GPU 1.67% → 0.57%, lower in both rounds: the window without
WindowChromefrom Reticle 0.6 (Reticle 0.6 alone, in the same rounds: 4.1% and 0.60%). These are the noisiest figures, since other windows on screen move them too. - GPU (3D engine) of Pulse: 0.05% → 0.04%; private memory: 130 → 131 MB; working set: 211 → 214 MB; handles: 887 → 916
- Cold start: ~590 → ~510 ms
- Exe size: 10.3 → 10.5 MB
- The v1.2.0 figures of this session are lower than the ones measured on 28/9 (below): compare within one section only.
What's Changed
- Pulse 1.3.0: per-core bars, lighter sensors, administrator start that sticks, English only by @caste9612 in #3
Full Changelog: v1.2.0...v1.3.0