Skip to content

Release Notes

goodmorning-claude 1.2.0 - 11 Jul 2026

Changes

  • New default scheduleinstall with no --time now fires at 07:05, 12:10 and 17:15 (previously 07:05, 12:05 and 17:05). The pings are now spaced 5h05m apart rather than exactly 5 hours, so each one lands just after the previous usage window has closed instead of racing its boundary.

Existing installs are unaffected until you re-run install.

Fixes

Three ways the schedule could silently stop firing while status still reported it as healthy:

  • status now asks launchd whether the agent is really loaded, rather than inferring it from the plist file being present. An agent launchd has not loaded — booted out by hand, or left behind by a failed install — will never fire, and status used to report it as a working schedule. It now warns and exits 1.
  • A failed install no longer leaves a plist behind. If launchctl bootstrap fails, the plist written moments earlier is removed, so a plist on disk always means a schedule launchd has accepted.
  • install refuses to run from an ephemeral location. A uvx invocation's executable lives in uv's cache, which uv cache prune can delete; because the plist bakes in an absolute path, scheduling from uvx produced a schedule that worked right up until the cache was cleaned. install now detects this (and temp directories) and tells you to install persistently first. The previously documented uvx goodmorning-claude install is no longer supported — use uv tool install goodmorning-claude.

  • The pinned claude path is no longer resolved through its symlink. claude is installed as a stable symlink into a versioned directory (~/.local/bin/claude -> .../versions/2.1.110) which Claude Code retargets on every self-update. install used to pin the resolved target, which froze the schedule on whichever version happened to be current — and broke it outright once that version was pruned. The symlink is pinned instead, and run falls back to a PATH lookup if the pin has gone stale, so plists written by older versions repair themselves.

  • status now checks that the paths in the plist still exist. launchd registers a job by absolute path and only discovers the path is dead when it tries to spawn it, so a schedule whose executable was deleted — by uv tool upgrade, a rebuilt venv, a moved install — still reported as loaded and healthy while failing silently at every fire. status now reports that as fatal, and a stale Claude pin as a note.

Also:

  • uninstall now boots the agent out unconditionally, even when no plist is on disk. It could otherwise leave a loaded agent running with no way to stop it.
  • The launchd log is trimmed. run rolls ~/Library/Logs/goodmorning-claude.log over to a single .1 sibling once it passes 1 MB; nothing rotated it before.
  • --license is parsed by argparse rather than matched by scanning sys.argv, so an argument that merely looks like the flag can no longer trigger it.
  • status no longer echoes out-of-range fire times back from a hand-edited plist.

goodmorning-claude 1.1.0 - 17 Jun 2026

Features

  • Multiple daily fire timesinstall --time now accepts more than one HH:MM value (space-separated), writing a StartCalendarInterval array to the plist. Times are sorted and de-duplicated.
  • New default scheduleinstall with no --time now schedules three pings at 07:05, 12:05 and 17:05 (previously a single 07:05 ping), spaced ~5 hours apart so each opens a fresh usage window that carries through to the next.
  • status now lists every configured fire time.

Plists written by 1.0.x (a single StartCalendarInterval dict) are still read correctly.

goodmorning-claude 1.0.1 — 30 May 2026

Moved to new GitHub location: https://github.com/WaterJuice/goodmorning-claude

goodmorning-claude 1.0.0 — 23 Apr 2026

Initial release.

Features

  • macOS-only — requires Darwin; the CLI refuses to run on any other platform
  • Schedule a morning Claude pinginstall --time HH:MM sets up a daily run (default 07:05)
  • launchd integration — LaunchAgent plist installed in ~/Library/LaunchAgents/ with StartCalendarInterval
  • run feedback — manual invocations print the binary being used and the elapsed time on success or failure
  • --verbose / -v flag — accepted before or after the subcommand; emits detailed logs of every action and subprocess call to stderr
  • Resilient PATH handling — resolves claude at install time and bakes its directory into the plist so the schedule keeps firing even if the user's shell PATH depends on init scripts
  • Manual triggerrun invokes the morning ping on demand
  • Status commandstatus reports whether the schedule is installed and shows the configured time
  • Zero dependencies — stdlib only