Have Your Mac Announce the Time Every Hour

Schedule the built-in say command with a LaunchAgent so your Mac speaks the time on the hour.

macOSsayautomationlaunchdttsMedium risk
Save a LaunchAgent plist that runs /usr/bin/say with a StartCalendarInterval of minute 0, then load it with launchctl.

01Command

Command
$ cat > ~/Library/LaunchAgents/com.user.saytime.plist <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>com.user.saytime</string>
  <key>ProgramArguments</key><array>
    <string>/usr/bin/say</string><string>The time is</string><string>$(date +%%I %%M)</string>
  </array>
  <key>StartCalendarInterval</key><dict>
    <key>Minute</key><integer>0</integer>
  </dict>
</dict></plist>
EOF
launchctl load ~/Library/LaunchAgents/com.user.saytime.plist

02What it does

launchd is macOS's native scheduler and pairs perfectly with the built-in text-to-speech command say. A per-user LaunchAgent with StartCalendarInterval fires at minute 0 of every hour without needing cron or admin rights. Combine it with a shell wrapper if you want the phrase to include the actual current time.

03Risk

RiskMedium risk
!Warning: The Mac must be awake to speak — sleeping Macs skip the announcement. To change the wording or voice, edit the ProgramArguments array; to stop it entirely, unload and delete the plist.

04Undo

Undo
$ launchctl unload ~/Library/LaunchAgents/com.user.saytime.plist && rm ~/Library/LaunchAgents/com.user.saytime.plist

05Sources

Last verified: 2026-09-18 · Category: Media

06Related solutions