Your Claude Pro/Max 5-hour window starts at the first message — so this little robot sends it while you're still asleep. Your computer stays off. Your limits reset sooner.
Claude Max gives you a generous usage window that resets every five hours. The catch: the timer starts at your first message, not at dawn.
Sit down at 10:00, hit your limit at noon — and now you're staring at the wall until 15:00. Five full hours, counted from when you showed up. That's the bug. This is the fix.
your reset time when you start at 10:00
← three hours of this is your own fault
A GitHub Actions cron checks in every few minutes — in the cloud, so your machine sleeps as late as you do. The schedule below is what actually happens.
The previous window has expired, so the automation sends Claude a one-line "gooodmorning claudeee!!!" on the cheapest model. The 5-hour clock starts ticking — while you're still in bed.
The window has already been running for two hours. You spend the morning burning tokens like a champ.
It happens to the best of us. But the clock started at 08:00, not 10:00 — so the reset lands at 13:00, not 15:00.
Fresh window, fresh tokens. You waited one hour instead of three. The cycle repeats itself, dynamically, all day long.
Two hours of waiting, gone. Every single day.
It's ~190 lines of dependency-free Python on a GitHub Actions cron. The boring parts are the point:
Every wake-up call reads Anthropic's own ratelimit response headers — the exact
reset time your account sees. No guessing, no "5 hours from when I last sent something":
it knows to the second when your window expires, even if you started it.
If the saved reset time is still in the future, the run exits immediately — zero API calls, zero quota. It only speaks when a new window actually needs starting.
The wake-up call is a single 1-token message on haiku, the cheapest model —
and that same call doubles as the status probe. One crumb of quota unlocks the whole loaf earlier.
Hit your limit? The 429 response still carries the reset time, so it stays in sync instead of erroring. Network hiccup? The next check, minutes later, simply tries again. Worst case: it does nothing.
You need a Claude Pro or Max subscription and a GitHub account. That's it.
Your fork carries the workflow. GitHub runs it for you, free, forever.
gh repo fork marcozambrella/goodmorning-claude --clone
On the machine where you're already logged into Claude Code. The token lives for a year.
claude setup-token # copy the printed token
Drop the token into your fork's Actions secrets. The cron takes over from there.
gh secret set CLAUDE_CODE_OAUTH_TOKEN --repo <you>/goodmorning-claude
Free, open source, and slightly ridiculous — like all the best automations.
Star it on GitHub