awewarm: Subscription Window Warmer
Keep AI coding-plan windows warm with one minimal request.
Connect once; awewarm detects what your Claude Code / Codex account or subscription endpoint can do, then makes sure the next usage window is always already open.
English · 简体中文
Connect once, then never think about 5-hour resets again: awewarm detects what it can do and only then keeps the next window open.
awewarm manages two kinds of connections:
- Account — your local
claude/codexCLI logins. awewarm reuses their login state and sends one minimal headless request (Reply with exactly: ok). No credentials are stored. - Subscription plan — any OpenAI Chat / OpenAI Responses / Anthropic-compatible endpoint with a base URL + token. The token goes to the macOS Keychain, never to disk.
It schedules those requests in three modes — fixed (absolute times, e.g. 06:35 / 11:40 / 16:45), interval (renew 5 h + a grace margin after each success), and hybrid (fixed anchor + interval renewal, the recommended default). Interval mode stays locked until the window semantics are verified or user-confirmed; fixed mode is always safe.
Install
Requires Python ≥ 3.9. Until the first PyPI release, install from source:
git clone <repo-url> && cd awewarm
pip install .
Quick Start
awewarm init # scan local accounts, pick a schedule, install the scheduler
awewarm status # see what will happen next
For a subscription endpoint instead:
awewarm add plan
You will be asked for the API base URL, token, protocol, and model; awewarm tests the endpoint with one minimal request, then stores the token in the Keychain.
Config
Users never hand-edit config; init / add plan generate it at ~/.config/awewarm/config.json (state at ~/.local/state/awewarm/state.json). The shape, for reference:
{
"version": 1,
"connections": {
"claude-code": {
"kind": "account",
"enabled": true,
"transport": {"kind": "claude-cli", "cliCommand": "claude"},
"window": {"status": "verified", "durationMinutes": 300},
"schedule": {
"mode": "hybrid",
"fixed": {"at": ["06:35"], "days": "weekday", "catchUpWindowMinutes": 45},
"interval": {"graceSeconds": 75, "jitterSeconds": 30}
}
}
}
}
Commands
awewarm init # interactive onboarding
awewarm discover # read-only scan of local CLIs and logins
awewarm add plan # add a subscription endpoint
awewarm status # human-readable summary
awewarm run [--dry-run] # one scheduler tick (launchd calls this)
awewarm activate <id> --confirm # send one real request now
awewarm verify <id> [--confirm] [--duration N --user-confirm]
awewarm enable <id> [--mode fixed|interval|hybrid]
awewarm times <id> [HH:MM...] # show or set fixed times, e.g. 06:35 11:40 16:45
awewarm disable <id>
awewarm remove <id>
awewarm install / uninstall # launchd scheduler agent (macOS)
awewarm inspect [<id>] [--json] # redacted capability dump
Development
pip install -e .
python3 -m unittest discover -s tests
See docs/CONTRIBUTING.md for the engineering doctrine and docs/CHANGELOG.md for release history.
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 awewarm-0.1.5.tar.gz.
File metadata
- Download URL: awewarm-0.1.5.tar.gz
- Upload date:
- Size: 45.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52d8f10833fe5cc1128f4f7d4845e29e534cdc6270ea6a724259426488fcad4a
|
|
| MD5 |
94264a67d0bec061a62ffd0f30679bae
|
|
| BLAKE2b-256 |
6abc0cd3c068a54fe2aab704294eee3ac39605a12591bf86444e028192b5d251
|
File details
Details for the file awewarm-0.1.5-py3-none-any.whl.
File metadata
- Download URL: awewarm-0.1.5-py3-none-any.whl
- Upload date:
- Size: 29.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1899088c709dc7375a14c754fd150246e1672c6aa538fddd84c31e5617c28b44
|
|
| MD5 |
843fb96f54a43fe44df1ce1152c25f7d
|
|
| BLAKE2b-256 |
fe77c0abc45cf080c1dd1853ff8822d17dc0996232b66355f66cf24d2710e021
|