Summary
A cross-platform command line tool that keeps your screen awake using a forward looking relative datetime interface.
On macOS, it uses caffeinate. On Linux KDE, it uses D-Bus ScreenSaver inhibition (via the dbus-inhibit binary). On other Linux desktops and headless systems, it falls back to systemd-inhibit.
Install
# uv (recommended)
uv tool install keep-screen-alive
# pipx
pipx install keep-screen-alive
For KDE Plasma support (prevents screen lock via D-Bus instead of systemd-inhibit):
uv tool install 'keep-screen-alive[dbus]'
# or
pipx install 'keep-screen-alive[dbus]'
This installs PyGObject, which requires gobject-introspection and cairo system libraries. On Fedora/Bazzite these are pre-installed; on Ubuntu install libgirepository1.0-dev and libcairo2-dev first.
Examples
$ date
Wed Jun 1 08:00:00 CDT 2023
$ keep-alive 2h
Keeping alive until 10:00AM CDT, Jun 01, 2023
$ keep-alive 12pm
Keeping alive until 12:00PM CDT, Jun 01, 2023
$ keep-alive 7am
Keeping alive until 07:00AM CDT, Jun 02, 2023
$ keep-alive clear
cleared keep-alive (pid 12345)
Configuration
Optional TOML config at $XDG_CONFIG_HOME/keep-alive/config.toml (defaults to ~/.config/keep-alive/config.toml). Override with --config PATH.
Define named aliases that resolve based on time-of-day and weekday. Each alias is an ordered list of rules; the first matching rule wins. Top-level [[rule]] entries are global rules, used as defaults when an alias has no matching rule, and when keep-alive is invoked without arguments.
# global rules: defaults for bare invocation and unmatched aliases
[[rule]]
target = "30m"
[[alias]]
name = "work"
[[alias.rule]]
start = "05:00"
end = "16:00"
days = ["Mon", "Tue", "Wed", "Thu", "Fri"]
target = "end"
[[alias.rule]]
target = "2h"
[[alias]]
name = "personal"
[[alias.rule]]
start = "09:00"
end = "21:00"
target = "end"
[[alias.rule]]
target = "1h"
[[alias]]
name = "project"
[[alias.rule]]
target = "4h"
keep-alive work on a weekday between 5am and 4pm keeps awake until 4pm; otherwise for 2h. keep-alive personal between 9am and 9pm keeps awake until 9pm; otherwise for 1h. keep-alive project keeps awake for 4h unconditionally. Bare keep-alive uses global rules.
keep-alive list summarizes the loaded config:
personal
09:00-21:00 → until 21:00
always → for 1h
project
always → for 4h
work
Mon, Tue, Wed, Thu, Fri 05:00-16:00 → until 16:00
always → for 2h
global
always → for 30m
Targets
Each rule has a target — a dateparser expression that resolves to a datetime. Targets flow through the same resolver as bare CLI input, so anything you can type at the prompt works as a target.
| Target | Resolves to |
|---|---|
"2h", "30m", "1h30m" |
now plus duration |
"4pm", "16:00" |
today at the given time |
"end" (requires start + end) |
today at the condition's window end |
Durations and time-of-day formats are parsed by dateparser: 2h, 30m, 1h30m, 1d, 45 minutes, 4pm, 16:00, etc.
Conditions
Optional. Omit all fields for an unconditional rule (always matches).
start,end- time-of-day window asHH:MM. Both must be set to form a range. Start inclusive, end exclusive. Overnight windows (start > end) wrap past midnight:22:00-02:00matches from 10pm to 2am.days- list of weekday abbreviations:Mon,Tue,Wed,Thu,Fri,Sat,Sun. Omit for daily.
Migration from action = "..."
Versions before 0.4 used an action field with kinds like relative_duration and until_window_end. That schema was removed in favor of target. To migrate, replace each rule's action (and accompanying fields) with a single target:
| Old | New |
|---|---|
action = "relative_duration"duration = "2h" |
target = "2h" |
action = "absolute_time"time = "16:00" |
target = "16:00" |
action = "until_window_end"(with start + end) |
target = "end" |
action = "extend_window"(with end + duration) |
No direct equivalent — use an explicit target expression like "17:00 + 1h" |
Development
Install uv and pre-commit, then:
uv sync
pre-commit install
pre-commit install --hook-type commit-msg
pre-commit install --hook-type pre-push
Run tests with uv run pytest. Pre-commit hooks run ruff (lint and format), pip-audit, and hygiene checks on commit; the commit-msg hook verifies conventional commit format; mypy and pytest run as pre-push hooks. CI runs the same checks on pull requests and on push to main.
Commit format
Commits follow Conventional Commits. PR titles must match - they become the squash-merge commit subject. Example: feat: add systemd-inhibit backend. Allowed types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert. Subject max 72 chars. Scope optional: fix(backends): handle missing caffeinate.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file keep_screen_alive-0.5.0.tar.gz.
File metadata
- Download URL: keep_screen_alive-0.5.0.tar.gz
- Upload date:
- Size: 94.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8adbdd8418d357cbba4d7df4893fbd4fbfcffcd40fc68a409fe9f824589a434b
|
|
| MD5 |
98c5edd80ee5848a312628379c213de5
|
|
| BLAKE2b-256 |
5d7e289aac1c90a09e7f03e5a84f831edfe72119cee914826387d333501ff6e7
|
Provenance
The following attestation bundles were made for keep_screen_alive-0.5.0.tar.gz:
Publisher:
publish.yml on willist/keep-screen-alive
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
keep_screen_alive-0.5.0.tar.gz -
Subject digest:
8adbdd8418d357cbba4d7df4893fbd4fbfcffcd40fc68a409fe9f824589a434b - Sigstore transparency entry: 2262161250
- Sigstore integration time:
-
Permalink:
willist/keep-screen-alive@3fd8dadab6b16b165376720aa1019c762bee63f5 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/willist
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3fd8dadab6b16b165376720aa1019c762bee63f5 -
Trigger Event:
release
-
Statement type:
File details
Details for the file keep_screen_alive-0.5.0-py3-none-any.whl.
File metadata
- Download URL: keep_screen_alive-0.5.0-py3-none-any.whl
- Upload date:
- Size: 24.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14c9de86a209ea4088afdc6b3ee5d2727766de926d55cdd3f59ac1136c809888
|
|
| MD5 |
af6d775a91c7ac171d0b5b5db300fdec
|
|
| BLAKE2b-256 |
5133a31d027f0ac5c581681bc81d6ae531205c0f3eb0b88827e06dadc46a9df3
|
Provenance
The following attestation bundles were made for keep_screen_alive-0.5.0-py3-none-any.whl:
Publisher:
publish.yml on willist/keep-screen-alive
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
keep_screen_alive-0.5.0-py3-none-any.whl -
Subject digest:
14c9de86a209ea4088afdc6b3ee5d2727766de926d55cdd3f59ac1136c809888 - Sigstore transparency entry: 2262161693
- Sigstore integration time:
-
Permalink:
willist/keep-screen-alive@3fd8dadab6b16b165376720aa1019c762bee63f5 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/willist
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3fd8dadab6b16b165376720aa1019c762bee63f5 -
Trigger Event:
release
-
Statement type: