mrkeyoor.com_
Fri 16 Oct 18:51 UTC
Dev Toolsevaluationupdated 14 Oct 2026

HaloBattery review

HaloBattery shows the battery level of supported wireless mice, keyboards, headsets, and controllers in the Windows system tray. It gives each device an icon and low-battery alerts so you can check several brands without opening each maker's software.

+2 / 1dstars / 7d
Verdict

Our HaloBattery run built in 4 seconds but its test step failed, with 506 passing cases, 3 failures, and 14 collection/setup errors in the Linux sandbox. It is worth trying on Windows when your exact model and connection are verified in the device table, with a real-device check before relying on its alerts. Skip it if you require signed binaries or expect a supported brand name to guarantee every peripheral.

We ran it

Lab card: what happened when we ran HaloBatteryScreenshot of HaloBattery (github.com/HeyOkay/HaloBattery)
Install✓ · 17s40 packages · 61 MB
Build✓ · 4s
Tests✗ · 12s506 passed · 3 failed · 14 errors of 523 (pytest)
Known vulns0(pip-audit)
Repo118 files~25,984 lines of source · 2 MB · 1 CI workflows · tests dir

Answers from our run

Does HaloBattery build from source?

Dependencies installed in 17 seconds (40 packages), and the build succeeded in 4 seconds. We cloned commit 2251f05 into a clean Debian container with 3 CPUs and no project-specific setup.

Do HaloBattery's tests pass?

Not all of them: 506 of 523 passed and 3 failed when we ran the project's own test command (pytest), with 14 collection errors. Some failures need services or credentials a bare container does not have.

Does HaloBattery have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use HaloBattery?

Linux or macOS users seeking a supported desktop tray app: the documented application targets Windows.

What are the alternatives to HaloBattery?

HeadsetControl, Solaar. Our HaloBattery run built in 4 seconds but its test step failed, with 506 passing cases, 3 failures, and 14 collection/setup errors in the Linux sandbox.

Setup3/5Install and build passed, but Windows packaging and hardware matter
Docs4/5Clear device verification labels, settings, diagnostics, and ZIP guidance
Community4/5October push, detailed device reports, and 117 open issues and PRs
Maturity3/5Active device fixes, but our Linux suite failed and support varies

Who it’s for

Windows users with supported peripherals who want battery information in one tray interface.
Gamers who prefer alerts held until a full-screen session ends and can check their exact device connection.
Python developers willing to investigate device protocols and compare readings with real hardware.

Who it’s NOT for

Linux or macOS users seeking a supported desktop tray app: the documented application targets Windows.
Windows deployments that require signed executables: the README says the download is not code-signed and may trigger SmartScreen.
Owners assuming a supported brand guarantees their model: the device table labels some entries unverified or likely, and current issues report missing readings for specific models.
PlayStation Bluetooth users needing constant battery readings without changing controller behavior: full-report mode can hide the controller from DirectInput games until it is power-cycled.
Developers requiring a green fresh-Linux-container suite: our test step failed with 3 failures and 14 collection/setup errors.

Setup reality

Our sandbox installed commit 2251f05 in 17 seconds, adding 40 packages and occupying 61 MB. The build passed in 4 seconds. Tests failed with exit 1 after 12 seconds: 506 passed, 3 failed, and 14 collection/setup errors in the supplied 523-case summary. Pip-audit reported 0 known vulnerabilities.

The usual user route is the Windows release ZIP: extract the whole folder, including _internal, and launch the executable. No hosted-service credential is listed for battery readings. Source use requires Python and the documented Windows batch scripts. Supported hardware must be connected and awake.

The failing log shows NoneType loader errors and Xlib DisplayNameError with an empty display name. It does not establish the cause of every failure or validate Windows operation. The executable is unsigned, some receivers conflict with vendor tools, and hardware verification varies by model and connection.

A Windows tray icon can replace several battery panels

A wireless headset and mouse from different brands often put their battery readings in different applications. HaloBattery puts supported devices in the Windows tray with individual icons, low-battery thresholds, and a charging indication. It reads through receivers, cables, or Windows Bluetooth instead of requiring each maker's application for the reading. The appeal is ordinary and useful: you can check your peripherals without opening separate control panels before starting a game or call.

Our checkout was 2 MB, and the installed environment occupied 61 MB after 40 packages arrived. The small footprint makes it approachable as a Python project. It doesn't tell you whether your mouse will answer correctly. Device protocols, transport modes, and hardware reports drive the usefulness of a battery monitor. HaloBattery's documentation helps here by distinguishing devices seen working on hardware from entries inferred from related models or borrowed protocol implementations.

What happened when we ran it

Our sandbox installed commit 2251f05 in 17 seconds and built it in 4 seconds, but the test step failed with exit 1 after 12 seconds. The supplied summary reports 506 passed, 3 failed, and 14 collection/setup errors across 523 cases. We ran it on October 14, 2026, in an unprivileged Debian container with 3 CPUs, 8 GB of RAM, the uv Python 3.12 Bookworm image, and no secrets.

The 3 failed cases were in test_xinput.py and test_xinput_wired.py, covering Bluetooth-entry handling, coarse Xbox readings, and a wired-but-discharging case. All reported AttributeError involving a NoneType object's loader. The log also names tray-feature and tray-icon loader errors, plus Xlib DisplayNameError with an empty display name in test_updates.py. It does not explain why the loader object was absent. Pip-audit reported 0 known vulnerabilities. Our scan counted 118 files and about 25,984 source lines, found 1 CI workflow file and a tests directory, and found no Dockerfile. The command failed despite its many passing cases. The run does not validate Windows tray behavior or physical-device reading accuracy.

Whole-folder extraction matters for the Windows download

The README's installation steps tell users to extract the release ZIP and keep the executable beside its _internal folder. Copying only the executable or launching it from inside the archive is a documented source of startup trouble. Source users get a Windows batch-script route and a console probe for device discovery. No hosted-service credential is listed for the basic battery-reading path, though update checks contact GitHub for releases.

Our 17-second dependency install therefore isn't the effort a typical Windows user will encounter. They use the packaged download, which the README says is unsigned and can trigger SmartScreen. That is a concrete reason a managed Windows fleet may reject it. Public GitHub Actions build logs help someone inspect how a release was produced, but they do not change its signing status. For personal use, keep the extracted application folder together when moving or updating it.

Model and connection matter more than the brand list

The device table marks entries as verified, unverified, or likely, and lists their connection method. A Corsair Virtuoso SE reading over a particular receiver is verified while the XT is described as untried. A broadly supported family can still contain a model without an observed reading. Open issue 263 reports an EasySMX X20 connecting without a battery level, while issue 262 reports the same basic problem for a Lamzu Tachi.

The 506 passing cases from our run cannot resolve either hardware report. A sensible trial uses the exact connection you intend to keep, compares the reported level with another available reading, and checks behavior during charging and sleep. The README also says vendor software may hold a receiver, so close it during diagnosis. If the device remains missing, the built-in diagnostics report is the documented route to a useful issue rather than repeated reinstallations.

Bluetooth controller readings can conflict with game input

PlayStation controllers report battery status over Bluetooth in full-report mode. The device documentation says enabling that mode can make a controller disappear from DirectInput games until it is switched off and on again. HaloBattery avoids forcing the mode by default and may show the controller without a level until Steam or a game enables it. USB readings have a different path. Owners should read that note before assuming a missing Bluetooth percentage is simply a broken detector.

The 3 failed cases in our sandbox concern Xbox-related handling, not a measured PlayStation game conflict. Keeping those findings separate matters. Quiet-while-gaming settings hold notifications during full-screen use, while the diagnostics feature can expose Bluetooth MAC addresses and serial numbers in its report. The README tells users they can replace those identifiers before posting. A report should help identify the transport and protocol without publishing device identifiers unnecessarily.

October fixes show maintenance, with a same-version update wrinkle

GitHub recorded the last push on October 12, 2026, with 649 stars and 117 combined open issues and PRs. Recent device reports accompanied release v1.15.0. Its notes say the download was rebuilt that day to fix startup hanging in an unwritable installation folder. The version stayed unchanged, and the release tag still points to the original commit. Users of the earlier archive must download it again because the app won't offer that rebuild as a newer version.

HeadsetControl fits supported USB headsets when you also need audio controls. Solaar serves Linux users managing Logitech devices. The 61 MB installed environment makes HaloBattery easy to keep locally, but a Windows trial needs the exact hardware path its table verifies. Before letting the tray icon replace another battery reading, check the device through charging, sleeping, and reconnecting on your own PC.

Alternatives

ProjectWhat it isPick it when
HeadsetControlA tool for supported USB gaming headsets on Windows, Linux, and macOS, including battery and audio controls.pick this instead when your headset needs sidetone, lighting, or equalizer controls as well as battery status.
SolaarA Linux manager for supported Logitech wireless devices, receiver pairing, and settings.pick this instead when you use Linux with Logitech hardware and need device management beyond a battery icon.

What people are saying

  1. [velocity-scout] HeyOkay/HaloBattery

Sources

  1. HaloBattery README
  2. Measured device support table
  3. HaloBattery settings and source route
  4. Release v1.15.0 and rebuilt download
  5. EasySMX X20 battery report
  6. Lamzu Tachi battery report
  7. HeadsetControl
  8. Solaar

More dev tools reviews

compose-samples · librepods · sqlmap · coucou · world-execute-me-dsh-pv · mcp-extensions · the whole board →