Show HN: Backlit Keyboard API for Python
Summary
A beginner-friendly Python package and CLI tool to control keyboard backlight brightness on Linux with mock-safe testing.
View Cached Full Text
Cached at: 04/22/26, 01:59 AM
itsmeadarsh2008/backlit-kbd
Source: https://github.com/itsmeadarsh2008/backlit-kbd
backlit-kbd
Beginner-friendly Python package to control keyboard backlight brightness.
It supports:
- Real Linux keyboard backlight devices (auto-discovered from sysfs)
- A mock backend for safe testing without touching laptop hardware
What This Means
- If you use
--mock, commands run in memory only (safe for learning). - If you do not use
--mock, the package tries real hardware automatically. - You usually do not need
--device-path.
Installation
Step 1: Install from PyPI
pip install backlit-kbd
Step 2 (optional): Install local editable version for development
pip install -e .
Step 3 (optional): Install dev dependencies
pip install -e .[dev]
Quick Start (Python)
Step 1: Import
from backlit_kbd import NotificationBlinker, create_controller
Step 2: Create a safe controller (mock fallback)
controller = create_controller(fallback_to_mock=True)
Step 3: Turn on brightness to 60%
controller.turn_on(60.0)
Step 4: Blink for a notification
controller.blink(count=3, on_ms=120, off_ms=120, level_percent=100.0)
Step 5: Use async notification manager
blinker = NotificationBlinker(controller)
blinker.start("chat-message", count=5, on_ms=80, off_ms=120)
CLI Guide (Beginner Friendly)
1) Check Current State
With mock backend:
backlit-kbd --mock info
With real hardware backend:
backlit-kbd info
2) Set Brightness by Raw Level
With mock backend:
backlit-kbd --mock set 2
With real hardware backend:
backlit-kbd set 2
3) Set Brightness by Percentage
With mock backend:
backlit-kbd --mock percent 75
With real hardware backend:
backlit-kbd percent 75
4) Increase and Decrease
Increase by default step (1):
backlit-kbd --mock inc
Increase by custom step:
backlit-kbd --mock inc 2
Decrease by custom step:
backlit-kbd --mock dec 2
Real hardware equivalents:
backlit-kbd inc
backlit-kbd inc 2
backlit-kbd dec 2
5) Turn On and Off
With mock backend:
backlit-kbd --mock on --percent 40
backlit-kbd --mock off
With real hardware backend:
backlit-kbd on --percent 40
backlit-kbd off
6) Blink Pattern (Synchronous)
With mock backend:
backlit-kbd --mock blink --count 4 --on-ms 100 --off-ms 100 --level-percent 100
With real hardware backend:
backlit-kbd blink --count 4 --on-ms 100 --off-ms 100 --level-percent 100
7) Notification Blink (Async-style Command)
With mock backend:
backlit-kbd --mock notify --name chat --count 5 --on-ms 80 --off-ms 120 --level-percent 100
With real hardware backend:
backlit-kbd notify --name chat --count 5 --on-ms 80 --off-ms 120 --level-percent 100
Full CLI Commands
Global options:
--mockUse in-memory backend (safe, no hardware writes)--device-path PATHOptional advanced override for a specific sysfs device
Commands:
infoset <value>percent <value>inc [step]dec [step]on [--percent N]offblink [--count N --on-ms N --off-ms N --level-percent N]notify [--name NAME --count N --on-ms N --off-ms N --level-percent N]
Examples Folder
Scripts:
examples/blink_notification.pyexamples/brightness_wave.pyexamples/disco_light.py
Run them:
python examples/blink_notification.py
python examples/brightness_wave.py
python examples/disco_light.py
Testing
Run tests:
python -m pytest
If you are using the project virtual environment:
.venv/bin/pytest
Troubleshooting
Permission deniedon Linux real hardware mode:
- You may need proper privileges/udev rules to write to sysfs.
- No device found in real hardware mode:
- Use
--mockfor learning/testing. - Or use
create_controller(fallback_to_mock=True)in Python.
- Want safe practice mode always:
- Use
--mockin CLI, orforce_mock=True/fallback_to_mock=Truein code.
Release and Publish
This repo has GitHub Actions workflows:
CIruns tests on push and pull requestPublishbuilds and publishes to PyPI- Uses
astral-sh/setup-uv - Uses PyPI Trusted Publishing (OIDC)
To publish a new version:
- Update version in
pyproject.toml - Create and push a tag like
v0.1.1 - Or publish a GitHub release
Support
- Buy Me a Coffee: https://buymeacoffee.com/itsmeadarsh
- GitHub Sponsors (individual/company): https://github.com/sponsors/itsmeadarsh2008
Contributing
- Start with
examples/ - Check tests in
tests/ - Open issues and PRs
License
MIT License. Created by Adarsh Gourab Mahalik.
Similar Articles
Show HN: A free Linux adaptation of NETworkManager by BornToBeRoot
NMLinux is a free, open-source Linux adaptation of NETworkManager, providing a unified GUI for common network tools. Built with Python and PySide6, it includes modules for SSH, RDP, VNC, Wi-Fi, traceroute, speed test, and more, aimed at sysadmins and power users.
Key, in sight – A guide, of sorts, to keyboard customization
A comprehensive guide to keyboard customization, covering hardware like macro pads and software approaches to enhance productivity and enjoyment, aimed at enthusiasts and newcomers alike.
OpenAI's first branded hardware is... a light-up keyboard?
OpenAI launches its first branded hardware, the $230 Codex Micro keyboard, a limited-run collaboration with Work Louder that provides color-coded lights and quick-access keys for monitoring and interacting with Codex AI agents.
@kentcdodds: I just... I mean I have a keyboard already... Wha...
OpenAI Developers announces kbd-1.0-codex-micro, a customizable keyboard with buttons and joystick for Codex workflows, built with Work Louder.
Show HN: Nimic – Pure Python as a systems language with AOT compilation
Nimic is a pure Python module that enables writing AOT-compilable code using a Python DSL that transpiles to Nim, achieving C-level performance while remaining valid Python.