Turns off the red dot on your ThinkPad lid, and keeps it off after every reboot and every wake-up. Free, open source, 5 KB of actual working code.
Interface language: English, Русский, 中文 — the dropdown in the corner. Your choice is remembered.
There is a red LED in the dot of the "i" on the ThinkPad logo, on the back of the lid. It has been there for decades. It is lit the whole time the laptop is awake, and it is brighter than you think until you sit in a dark room with it.
I noticed mine properly in a café. I was at a table by the window, the laptop open, and the person across from me kept glancing at the back of my screen. There was nothing on the back of my screen except a small red dot, calmly glowing at everyone behind me. On a night flight it looks like a standby light someone forgot to switch off. In a dark bedroom, when you are the only one still awake, it is a little red eye.
Nobody at Lenovo thinks about it, because the dot has one job: it tells you the machine is on when the lid is closed. Fair enough. But there is no BIOS option for it, and no Windows setting. The dot is simply not negotiable.
So I made it negotiable.
- Turn the dot off, on, or make it blink — one click.
- Keep it off automatically at Windows startup and after sleep or hibernate.
- Three interface languages.
That is the whole product. There is no tray icon, no updater, no account, no telemetry, no settings you have to learn.
The dot is wired to the laptop's Embedded Controller — the small always-on chip
that also watches your lid switch, your battery and your fans. One byte in EC
register 0x0C decides what the LED does:
| State | Byte |
|---|---|
| off | 0x0A |
| on | 0x8A |
| blink | 0xCA |
That is genuinely all. LedDot.exe opens the EC, writes the byte, closes, and
exits — 5120 bytes of program, a few milliseconds of life. Nothing stays in
memory afterwards.
Port-level access needs a kernel driver, so the signed WinRing0 driver does
that part. It is the same route other ThinkPad LED utilities take, and the same
register the Linux thinkpad_acpi driver exposes as lid_logo_dot. Fan and
charging control are not touched.
To keep the dot off without a resident program, the app registers one Scheduled Task that fires the 5 KB executable on boot, logon and resume. Two details there were not obvious:
- The resume trigger listens to
Kernel-Power507/107 as well asPower-Troubleshooter1. Modern laptops sleep in S0 "Modern Standby" and never emit the classic wake event, so a task built only on the old event looks fine in Task Scheduler and silently never runs. - The task runs as your user (S4U, highest privileges). Registered as SYSTEM it did not survive a reboot on my machine — created fine, gone after restart. As the user it stays.
Small things, but they are the difference between "works" and "worked once".
WinRing0 is on Microsoft's vulnerable-driver blocklist. If Windows Memory integrity (Core isolation) is on — and on many Windows 11 machines it is on by default — the driver will not load and the buttons will do nothing.
The app checks this at startup and tells you in plain words instead of failing silently. If you see that warning, you have two honest options: switch Memory integrity off in Windows Security, or close the app and keep the dot. Both are reasonable. I am not going to pretend the trade-off does not exist.
Your antivirus may also flag the driver for the same reason. That is expected for anything that talks to an embedded controller, and it is why the full source is in this repository.
- A ThinkPad with the red dot on the lid.
- 64-bit Windows 10 or 11. .NET Framework 4.x, which is already there.
- Administrator rights, to load the driver. The app asks for them itself.
Tested on a ThinkPad X9-15 Gen 1 (Aura Edition) running Windows 10 LTSC. That is one machine — mine. The register has been the same across ThinkPad generations for a long time, so it very likely works on yours, but I can only promise what I have actually seen. If the Off and On buttons do not change your dot, your model does not answer to this method. Nothing breaks; nothing is written anywhere else.
- Download the release, unblock the zip, extract the whole folder. Keep the
four files together:
LedDotGui.exe,LedDot.exe,WinRing0x64.dll,WinRing0x64.sys. - Run
LedDotGui.exeand accept the elevation prompt. - Click Turn off. To make it permanent, tick At Windows startup and After sleep / hibernate.
Windows SmartScreen may warn you, because the files are not signed with a certificate — a code-signing certificate costs more per year than this tool is worth. More info → Run anyway.
From a script or your own task:
LedDot.exe off (also: on | blink)
Exit codes: 0 done, 3 driver refused to load, 4 controller busy,
5 another hardware tool holds the bus.
Untick both boxes to delete the scheduled task, or run uninstall.cmd as
administrator — it restores the dot, removes the task and the driver service.
Then delete the folder. Nothing else was ever written to your system, apart from
one registry value remembering your language.
No SDK, no toolchain, no package manager. The C# compiler that ships with Windows is enough:
csc /target:winexe /platform:x64 /win32manifest:app.manifest /win32icon:app.ico ^
/r:System.Windows.Forms.dll /r:System.Drawing.dll ^
/out:LedDotGui.exe LedDotGui.cs
csc /platform:x64 /out:LedDot.exe LedDot.cs
csc.exe lives in C:\Windows\Microsoft.NET\Framework64\v4.0.30319\.
LedDotGui.cs is UTF-8 with BOM, because it holds Russian and Chinese text
and the compiler otherwise reads it as the local ANSI codepage and mangles it.
- The EC method comes from valinet/ThinkPadLEDControl and from the Linux
thinkpad_acpilid_logo_dotinterface. Without those I would have been poking at registers blindly, which is not something you do on a laptop's embedded controller. - Hardware access via WinRing0, © Noriyuki Miyazaki (OpenLibSys), included under its own license.
MIT. Take it, use it, fork it, ship it inside something else, no attribution anxiety. It is free and it always will be — I wrote it because a small red dot annoyed me, and there is no reason for anyone else to pay for that.
No warranty. It writes to your embedded controller; if that sentence worries
you, read LedDot.cs first. It is 130 lines and most of them are comments.
