{"_id":"@codelined/warmy","_rev":"6-552e3dd7cc86e540f3b5f182c2cc5cb7","name":"@codelined/warmy","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@codelined/warmy","version":"1.0.0","keywords":["claude","codex","warmup","rate-limit","cli","anthropic","openai"],"author":"","license":"MIT","_id":"@codelined/warmy@1.0.0","maintainers":[{"name":"codelined","email":"supporto@codelined.com"}],"homepage":"https://github.com/codelined-ag/warmy#readme","bugs":{"url":"https://github.com/codelined-ag/warmy/issues"},"bin":{"warmy":"dist/cli.js"},"dist":{"shasum":"667c007528dfee953f7acbc1be89774c08328a42","tarball":"https://registry.npmjs.org/@codelined/warmy/-/warmy-1.0.0.tgz","fileCount":71,"integrity":"sha512-xowN+AHoSMI5XDQGGUQ39rS0eTsHgvB3Z1puDh1Y73pHeYMuaRqSeAJ0mP2EcuKlgodlb8EykK2hVR3d+Au9vg==","signatures":[{"sig":"MEUCIH0SbwJO8UhUOaUpS4/f1803fqISFKOEF2RszRc6gvUsAiEAz4cC0NAd6Gww1k9mRjBg3tWl170B6vYu/Rb4H7Z48So=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1041106},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"59f6f4c7183d607a9bd3d86245c6f39e9c117053","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"codelined","email":"supporto@codelined.com"},"repository":{"url":"git+https://github.com/codelined-ag/warmy.git","type":"git"},"_npmVersion":"11.11.0","description":"Keep your Claude Code and Codex CLI sessions warm — automatically. Sends periodic pings via the Anthropic API to reset the 5-hour rate limit window before it expires.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"keytar":"^7.9.0","commander":"^12.1.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","vitest":"^1.3.0","typescript":"^5.4.0","@types/node":"^20.11.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/warmy_1.0.0_1778107475009_0.6926969521370616","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@codelined/warmy","version":"1.0.1","keywords":["claude","codex","warmup","rate-limit","cli","anthropic","openai"],"author":"","license":"MIT","_id":"@codelined/warmy@1.0.1","maintainers":[{"name":"codelined","email":"supporto@codelined.com"}],"homepage":"https://github.com/codelined-ag/warmy#readme","bugs":{"url":"https://github.com/codelined-ag/warmy/issues"},"bin":{"warmy":"dist/cli.js"},"dist":{"shasum":"de5a59af95db6702af8251200c57d32731ba2160","tarball":"https://registry.npmjs.org/@codelined/warmy/-/warmy-1.0.1.tgz","fileCount":71,"integrity":"sha512-syfLAsYSJ+fUIvp5usvm3aeMgFN4SUsSMb6OpLk69efUuq/Vore+Sl2xtYtdiFjXhvknr0R64CVV4FGDoG3UPw==","signatures":[{"sig":"MEYCIQDbumFx6XSQ+0QJixdaFYVnKVl3zkULxdAcnd8BUxUiGgIhAMiFjxXhP5yI9OJ1os86BdNu7RHPs7wbyxfS3feCcmjN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1041188},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"fa1d9a1032a86b7aab1d11bcdb56699a289d5646","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"codelined","email":"supporto@codelined.com"},"repository":{"url":"git+https://github.com/codelined-ag/warmy.git","type":"git"},"_npmVersion":"11.11.0","description":"Keep your Claude Code and Codex CLI sessions warm — automatically. Sends periodic pings via the Anthropic API to reset the 5-hour rate limit window before it expires.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"keytar":"^7.9.0","commander":"^12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","vitest":"^1.3.0","typescript":"^5.4.0","@types/node":"^20.11.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/warmy_1.0.1_1778107701544_0.795554435035742","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@codelined/warmy","version":"1.1.0","keywords":["claude","codex","warmup","rate-limit","cli","anthropic","openai"],"author":"","license":"MIT","_id":"@codelined/warmy@1.1.0","maintainers":[{"name":"codelined","email":"supporto@codelined.com"}],"homepage":"https://github.com/codelined-ag/warmy#readme","bugs":{"url":"https://github.com/codelined-ag/warmy/issues"},"bin":{"warmy":"dist/cli.js"},"dist":{"shasum":"af0d88a3ae78d141552940494fc9b7841dc85a65","tarball":"https://registry.npmjs.org/@codelined/warmy/-/warmy-1.1.0.tgz","fileCount":71,"integrity":"sha512-oDQAkrz+VjRj1lZv0zHj2BrmqWLhg43GcqPCTu7gyQfDg0W9HMq3cbHu+ZDmSBrNOMVIg3QovP9frzzuSoKtXQ==","signatures":[{"sig":"MEUCIQDBZ4Av9jiT7IQKlDvCtNy7PDjrStCg4yyG5FYoXd/K5QIgXjDyacmoVDolKX2BXGTUgWYwtCqKLZjdVhpiEIZxGSo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1044495},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"d0c276a60749c8ec8a714aa352498eb405b3deea","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"codelined","email":"supporto@codelined.com"},"repository":{"url":"git+https://github.com/codelined-ag/warmy.git","type":"git"},"_npmVersion":"11.11.0","description":"Keep your Claude Code and Codex CLI sessions warm — automatically. Sends periodic pings via the Anthropic API to reset the 5-hour rate limit window before it expires.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"keytar":"^7.9.0","commander":"^12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","vitest":"^1.3.0","typescript":"^5.4.0","@types/node":"^20.11.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/warmy_1.1.0_1778124366419_0.008963408932820771","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@codelined/warmy","version":"1.1.1","keywords":["claude","codex","warmup","rate-limit","cli","anthropic","openai"],"author":"","license":"MIT","_id":"@codelined/warmy@1.1.1","maintainers":[{"name":"codelined","email":"supporto@codelined.com"}],"homepage":"https://github.com/codelined-ag/warmy#readme","bugs":{"url":"https://github.com/codelined-ag/warmy/issues"},"bin":{"warmy":"dist/cli.js"},"dist":{"shasum":"ba58182b2c03a06b7df2ffd85af440cbc510d0b4","tarball":"https://registry.npmjs.org/@codelined/warmy/-/warmy-1.1.1.tgz","fileCount":71,"integrity":"sha512-ziMYhswpGMMSDoxyiusYBItfB/A6ZfzRQBwBFW/+N6lKoHyzRmP1m1hoy3v1ucseLNi/wCnRzCqiakmqifCPoQ==","signatures":[{"sig":"MEUCICx6axb2cHNS69P73GQeb5S1HEdQ6zqx92oKKvve4+H1AiEAilzSUKE3jgqn1d3sMfZjjldSqz625KvOFhJ1f+6VVqc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1046225},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"7300687b43baf34839399c37989b68005229d75c","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"codelined","email":"supporto@codelined.com"},"repository":{"url":"git+https://github.com/codelined-ag/warmy.git","type":"git"},"_npmVersion":"11.11.0","description":"Keep your Claude Code and Codex CLI sessions warm — automatically. Sends periodic pings via the Anthropic API to reset the 5-hour rate limit window before it expires.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"keytar":"^7.9.0","commander":"^12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","vitest":"^1.3.0","typescript":"^5.4.0","@types/node":"^20.11.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/warmy_1.1.1_1778124622741_0.31179144158764194","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@codelined/warmy","version":"1.1.2","keywords":["claude","codex","warmup","rate-limit","cli","anthropic","openai"],"author":"","license":"MIT","_id":"@codelined/warmy@1.1.2","maintainers":[{"name":"codelined","email":"supporto@codelined.com"}],"homepage":"https://github.com/codelined-ag/warmy#readme","bugs":{"url":"https://github.com/codelined-ag/warmy/issues"},"bin":{"warmy":"dist/cli.js"},"dist":{"shasum":"a158d56bbc0842f42c4630459e25bdb51e0c3dc3","tarball":"https://registry.npmjs.org/@codelined/warmy/-/warmy-1.1.2.tgz","fileCount":71,"integrity":"sha512-jTWg4aHRajvSzwrj5jyO+YXVwA4y/PabzdiDPdHe6k0y2FrtDewa6TmJeBiME2ZZD1HmqvsygwMRL+sTlKdssg==","signatures":[{"sig":"MEYCIQCixmGuD3x0aLyxJnMGvjkeUj9RrWeHtEArJxW+eDWbZAIhAMzPoQLD4mn8qb/vq9Z8hhDooO/IGbQdLf+cHbe/eYWN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1046341},"type":"module","engines":{"node":">=18.0.0"},"gitHead":"2c5f62c9c2f2295b1aac18de41c6bb99d71133b4","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"codelined","email":"supporto@codelined.com"},"repository":{"url":"git+https://github.com/codelined-ag/warmy.git","type":"git"},"_npmVersion":"11.11.0","description":"Keep your Claude Code and Codex CLI sessions warm — automatically. Sends periodic pings via the Anthropic API to reset the 5-hour rate limit window before it expires.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"keytar":"^7.9.0","commander":"^12.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","vitest":"^1.3.0","typescript":"^5.4.0","@types/node":"^20.11.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/warmy_1.1.2_1778124769470_0.5784310263839838","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@codelined/warmy","version":"1.2.0","description":"Keep your Claude Code and Codex CLI sessions warm — automatically. Sends periodic pings via the Anthropic API to reset the 5-hour rate limit window before it expires.","type":"module","bin":{"warmy":"dist/cli.js"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest run","test:watch":"vitest","lint":"eslint src --ext .ts","prepublishOnly":"npm run build && npm test"},"keywords":["claude","codex","warmup","rate-limit","cli","anthropic","openai"],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/codelined-ag/warmy.git"},"homepage":"https://github.com/codelined-ag/warmy#readme","bugs":{"url":"https://github.com/codelined-ag/warmy/issues"},"publishConfig":{"access":"public"},"engines":{"node":">=18.0.0"},"dependencies":{"commander":"^12.1.0","keytar":"^7.9.0"},"devDependencies":{"@types/node":"^20.11.0","typescript":"^5.4.0","vitest":"^1.3.0","eslint":"^8.57.0","@typescript-eslint/eslint-plugin":"^7.0.0","@typescript-eslint/parser":"^7.0.0"},"gitHead":"ce9041eda25293a04dcfa5e0022074d8a5278df7","_id":"@codelined/warmy@1.2.0","_nodeVersion":"22.21.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-kCzVtHHQQH1gYpGrwyNC6EnLP9lV+i0FP2kgLGssKc+39opDX9xe6rGgEFtW75b6oknmvgdKEKY5KE2prRZMMA==","shasum":"3f14cb4d61042c4ffc0fc1e020f8fcac42d04fa0","tarball":"https://registry.npmjs.org/@codelined/warmy/-/warmy-1.2.0.tgz","fileCount":83,"unpackedSize":1114221,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDprI/lyxNALE1Ynpd+oeNleshloDYJ8dNYq71ZsjE4vQIhANviE0AaDwHyJ1gCztZ2Qk9g+EGf4NV3d3uzyVLasr1c"}]},"_npmUser":{"name":"codelined","email":"supporto@codelined.com"},"directories":{},"maintainers":[{"name":"codelined","email":"supporto@codelined.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/warmy_1.2.0_1778187508822_0.9248788510573032"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-06T22:44:34.930Z","modified":"2026-05-07T20:58:29.186Z","1.0.0":"2026-05-06T22:44:35.256Z","1.0.1":"2026-05-06T22:48:21.742Z","1.1.0":"2026-05-07T03:26:06.633Z","1.1.1":"2026-05-07T03:30:22.957Z","1.1.2":"2026-05-07T03:32:49.802Z","1.2.0":"2026-05-07T20:58:29.078Z"},"bugs":{"url":"https://github.com/codelined-ag/warmy/issues"},"license":"MIT","homepage":"https://github.com/codelined-ag/warmy#readme","keywords":["claude","codex","warmup","rate-limit","cli","anthropic","openai"],"repository":{"type":"git","url":"git+https://github.com/codelined-ag/warmy.git"},"description":"Keep your Claude Code and Codex CLI sessions warm — automatically. Sends periodic pings via the Anthropic API to reset the 5-hour rate limit window before it expires.","maintainers":[{"name":"codelined","email":"supporto@codelined.com"}],"readme":"![Warmy](warmy.png)\n\n# Warmy\n\n**Never wait for your Claude Code or Codex CLI session to come back.**\n\nYou know that feeling. You sit down to ship something, type a prompt, and get hit with *\"You've reached your rate limit. Try again at 4:23pm.\"* Three hours of dead time you didn't ask for.\n\nWarmy fixes that. It quietly watches your 5-hour rate-limit window, waits for it to expire, then fires a tiny ping to start a fresh one. By the time you come back to your terminal, the window is already open and waiting for you.\n\n## Why Warmy\n\nClaude Code and Codex CLI both use a **rolling 5-hour rate-limit window**. The clock starts the moment you fire your first request, and the only way to get a new window is to wait for the old one to expire and then send another request. Skip that second step and you're locked out until you happen to type something hours later.\n\nWarmy automates the second step. It does one thing well:\n\n1. Reads your real API history from `~/.claude/history.jsonl` and `~/.codex/logs_1.sqlite`.\n2. Figures out exactly when your current 5-hour window expires.\n3. Sends a single warmup ping 1 minute after expiry.\n\nIf you're actively coding within 10 minutes of the reset, Warmy stays out of your way. Your own activity already refreshed the window.\n\n## Install\n\n```bash\nnpm install -g @codelined/warmy\nwarmy init\n```\n\nThat's it. `init` detects which CLIs you have installed, installs the scheduler, and starts the background daemon. Reboot whenever you want, the daemon comes right back.\n\n## Quick start\n\n```bash\nwarmy init      # interactive setup\nwarmy status    # see what Warmy is doing right now\nwarmy run       # force a warmup attempt\nwarmy upgrade   # pull the latest version from npm\n```\n\n## How it actually runs\n\nWarmy is a long-lived background daemon. It polls every **30 seconds** and only fires a real warmup when your window has just expired. The 30s cadence lets Warmy hit the right moment instead of waiting on the next 5-minute cron tick. Each tick reads `~/.claude/history.jsonl` and runs a couple of `sqlite3` queries against the Codex log, then exits if there's nothing to do, so the cost is negligible on any modern machine.\n\n| Platform | What gets installed | Auto-restart | Reboot persistence |\n|----------|---------------------|--------------|--------------------|\n| macOS    | `launchd` plist with `KeepAlive=true` and `RunAtLoad=true` | yes (launchd respawns) | yes (loads on login) |\n| Linux    | cron `@reboot warmy ensure-daemon` plus a 1-minute `ensure-daemon` watchdog | yes (watchdog respawns) | yes (cron starts at boot) |\n\nNo `loginctl enable-linger`. No systemd unit files. No surprises.\n\nThe daemon writes its PID to `~/.warmy/daemon.pid` and refuses to start a second instance. Output goes to `~/.warmy/daemon.log`. Failed warmups (expired token, network blip) trigger a 5-minute backoff so Warmy never hammers the API.\n\n## Commands\n\n| Command | What it does |\n|---------|--------------|\n| `warmy init` | Interactive setup. Installs the scheduler, starts the daemon. |\n| `warmy status` | Config, scheduler, daemon PID, next warmup time. |\n| `warmy run` | Run a single warmup check now. Useful for debugging. |\n| `warmy daemon` | Run the polling loop in the foreground. Used by the scheduler. |\n| `warmy ensure-daemon` | Start daemon unless explicitly stopped. Cron watchdog hook; will not override `stop-daemon`. |\n| `warmy start-daemon` | Force-start the daemon, clearing any stop marker. |\n| `warmy restart-daemon` | Stop the running daemon, clear the stop marker, and start fresh. |\n| `warmy stop-daemon` | Stop the daemon and prevent the watchdog from restarting it. |\n| `warmy upgrade` | Pull `@codelined/warmy@latest` from npm. Leaves config alone. |\n| `warmy set-message \"...\"` | Customize the warmup message. |\n| `warmy edit-config` | Open `~/.warmy/config.json` in `$EDITOR`. |\n| `warmy uninstall` | Stop daemon, remove scheduler, wipe config and tokens. |\n\n## Customizing the warmup message\n\n```bash\nwarmy set-message \"Hey Claude, just keeping the session warm.\"\n```\n\nBoth Claude Code and Codex receive this exact message during warmup. The default is `\"Hey Claude, just warming up the session. How's it going?\"`.\n\n## Upgrading\n\n```bash\nwarmy upgrade\n```\n\nPulls the latest version globally and never touches `~/.warmy/config.json`. By default, `warmy upgrade` also restarts the running daemon so the new code takes effect immediately. Pass `--no-restart` if you want to handle that yourself:\n\n```bash\nwarmy upgrade --no-restart\nwarmy restart-daemon\n```\n\n## Troubleshooting\n\n**\"Refusing to use ~/.warmy: owner uid 0 != ours ...\"** — you ran `warmy` with `sudo` at some point and the directory ended up root-owned. Fix:\n\n```bash\nsudo chown -R $USER ~/.warmy\n```\n\n**Logs** — the daemon writes to `~/.warmy/daemon.log` and rotates at 5 MB, keeping `daemon.log.1`, `.2`, `.3`. The cron watchdog logs to `~/.warmy/cron.log`.\n\n## Requirements\n\n- Node.js 18 or newer\n- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) or [Codex CLI](https://github.com/openai/codex) (or both) installed and signed in\n- macOS (launchd) or Linux (cron) for the scheduler\n\n---\n\n## Quality metrics\n\n![Desloppify Scorecard](scorecard.png)\n","readmeFilename":"README.md"}