npm i -g claudekishmish

claudekishmish

Keep a Claude Code usage window always running — and continue interrupted work in the terminal it stopped in.

v0.3.0 Windows · macOS · Linux MIT 1 dependency

The problem

A window you never claimed is time you never get back

A Claude Code usage window is five hours long. It starts at your first message — and it only advances when someone claims it. If your window ends at 02:00 and you send nothing until 09:00, those seven hours were dead. No window was running, so nothing accrued to you.

claimed went by unnoticed
Every window boundary over one real 49-day history: 62 of 71 went unclaimed.

Install · about two minutes

Three steps, then never think about it again

  1. Install the package

    terminal
    $ npm i -g claudekishmish
    
      claudekishmish
      Credits to Gantavya Singh Shekhawat
    
      Next:  ckm setup
  2. Run setup

    This writes the shim and the background service, then prints the one thing left for you to do.

    terminal
    $ ckm setup
    
      Two steps left — run these yourself:
    
      1. Put the shim FIRST on PATH —
         run it once, then open a new terminal:
    
         [Environment]::SetEnvironmentVariable('Path', ...)
    
      2. Start the background claimer.
    
      Both jobs are ON:
        auto-continue   ON   continue interrupted work
        window claiming ON   keep the countdown running
  3. Run the PATH line, then open a new terminal

    Not optional. Until the shim is on PATH, only half the tool is running: boundaries get claimed, but nothing is watching your sessions, so nothing can continue your work.

    On Windows, use the persistent line setup prints. The obvious $env:Path = … form lasts only until you close the terminal — and a tool that stopped working looks exactly like a tool that is working.

That's it. From here, run claude exactly as you always have.


Confirm

One command tells you which half is running

ckm status
$ ckm status

  Window
    current ends   11 Aug, 05:10 pm   (computed)
    next boundary  11 Aug, 05:10 pm   in 3h 52m
    last claimed   11 Aug, 12:10 pm

  Policy
    auto-continue  on
    idle claiming  on   (7/14 used this week)

  Install
    shim           active
    daemon         running (pid 37444)

shim active is the line that matters. If it says installed but NOT on PATH, step 3 didn't take — in-place continuation is off and nothing else will tell you.

When something misbehaves, ckm doctor checks every dependency by actually running it — no billable request:

ckm doctor
  [ok  ] claude is spawnable    2.1.227 (Claude Code)
  [ok  ] node-pty              available — sessions can be continued
  [ok  ] shim                  ~/.claudekishmish/shim
  [ok  ] daemon                running (pid 37444)

  No blocking problems.

What it does

Two jobs, both on by default

Job one

Claims the boundary

The moment a window expires, a minimal request starts the next countdown — even with no terminal open and nobody awake. Capped at 14 a week, announced at setup, and every claim is logged before it happens.

Job two

Continues your work

When a session stops at a limit, the continuation is typed into your actual terminal session once the window reopens. Same window, same context, work carries on.

without
09:00 → 14:00 dead 18:00 →
with ckm
09:00 → 14:00 14:00 → 19:00 19:00 →
09:0014:0019:0021:00
The same day. Windows only tile if something claims each boundary as it opens.

Three limits, three responses

Not every limit is the same limit

Claude Code has three separate caps, and treating them as one is what makes naive wait-and-retry tools hang for days. This is the panel they come from — /usage inside Claude Code:

Plan usage limitsMax (5×)
Current session resets in 1 min 22%
All models resets Thu 10:30 pm 63%
An illustration of Claude Code's usage panel. “Current session” is the five-hour window this tool keeps running.
LimitWhat claudekishmish does
Session
every 5 hours
Waits for the stated reset, then continues your work.
WeeklyParks it, suspends claiming so it can't spend the budget it exists to protect, and tells you.
Per-modelStops cleanly and hands back. Waiting cannot clear this one, so it doesn't pretend otherwise.
API overloaded
529 · stalled · dropped
No reset time exists, so it retries on a bounded backoff — 30s, 1m, 2m, 4m, 8m, then stops.

And if the account itself can't make requests — logged out, subscription ended — it halts rather than retrying an impossible request several times a day forever.


Reference

Every command, and when you'd want it

CommandWhen
ckm setupOnce, after installing.
ckm statusWindows, boundaries, sessions, and what it will do next.
ckm pauseStop auto-continuing this session. --all for everything, before you sleep.
ckm resumeSwitch it back on. Also clears a halt.
ckm claim offStop claiming boundaries when nothing is pending. Auto-continue stays on.
ckm doctorCheck every dependency by running it. Costs nothing.
ckm logsWhat it did while you were away.
ckm configContinuation text, caps, backoff, poll interval.
ckm uninstallRemove the shim and the service unit.

A real night

What you'd find in the log

Nothing here was typed by a person. This is ckm logs from a machine left running:

ckm logs
12:10:28  boundary.attempt   no pending work — claiming with a new session
12:10:34  ping.ok
17:10:26  boundary.attempt   no pending work — claiming with a new session
17:10:33  ping.ok
17:48:05  ledger.corrected   believed the window ended 12:20Z,
                              evidence says 11:40Z

That last line is the tool catching itself being wrong. What it believes about your window is re-derived from your own conversation history on every tick, so a mistaken belief lasts one tick instead of forever.

367tests
64/64mutations caught
91/91resets on the 10-min grid
86/86window predictions exact

Worth knowing

What it will not do

It does not reset, extend or bypass server-side limits — that's impossible, and nothing here attempts it. It waits for normal availability and then makes ordinary requests on your own account.

A sleeping machine claims nothing. If your laptop is suspended at 02:00, that boundary is claimed when you wake it, not at 02:00. Nothing in user space can fix that; if you want the countdown to survive the night, the machine has to stay awake.

And it never types over a message you've half-written. Every keystroke is forwarded, so it knows when your input box has a draft in it — appending to that and pressing Enter for you is the one way a tool like this could destroy work instead of saving it.