A macOS script that uses Claude CLI to read your daily log and send you periodic focus nudges as native notifications.
It runs on a 25/5 Pomodoro-style loop — nudge, wait 25 minutes, nudge, wait 5 minutes, repeat — from a configurable start time until your configured end-of-day.
Each cycle, the script:
- Reads your daily markdown log file (e.g.
~/notes/2026-03-04.md) - Sends the contents to Claude CLI with a prompt that prioritizes:
- Meetings starting within the next 60 minutes
- Highlighted items wrapped in
==double equals== - Fallback to the most important pending item
- Displays Claude's 2-line nudge as a macOS notification
- macOS (uses
osascriptfor notifications) - Claude CLI installed and authenticated
- A daily log file in markdown format, named by date (
YYYY-MM-DD.md)
All settings are configurable via environment variables. Defaults are shown below.
| Variable | Default | Description |
|---|---|---|
CLAUDE |
claude |
Path to the Claude CLI binary |
LOG_DIR |
$HOME/notes |
Directory containing daily log files |
TZ |
America/Los_Angeles |
Timezone for time display and scheduling |
END_HOUR |
15 |
Hour (24h) when the script stops (3 PM) |
END_MIN |
0 |
Minute when the script stops |
mkdir -p ~/.claude/scripts
curl -o ~/.claude/scripts/priority-nudge.sh \
"RAW_GIST_URL/priority-nudge.sh"
chmod +x ~/.claude/scripts/priority-nudge.shOr copy priority-nudge.sh from this gist manually.
mkdir -p ~/.claude/logsbash ~/.claude/scripts/priority-nudge.sh --onceYou should see a macOS notification with a focus nudge based on today's log. If the log file doesn't exist yet, Claude will tell you.
To run the script automatically on weekday mornings, use the included launchd plist template.
Edit the plist:
Open com.user.claude-priority-nudge.plist and replace these placeholders:
| Placeholder | Replace with |
|---|---|
__USERNAME__ |
Your macOS username (run whoami) |
__SCRIPT_PATH__ |
Full path to priority-nudge.sh |
Install it:
cp com.user.claude-priority-nudge.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.user.claude-priority-nudge.plistVerify it loaded:
launchctl list | grep priority-nudgeThe default schedule starts at 6:35 AM, Monday–Friday. Edit the StartCalendarInterval entries in the plist to change this. The Hour and Minute keys control when the loop begins each day. The script itself handles when to stop (via END_HOUR/END_MIN).
launchctl unload ~/Library/LaunchAgents/com.user.claude-priority-nudge.plist
rm ~/Library/LaunchAgents/com.user.claude-priority-nudge.plist
rm ~/.claude/scripts/priority-nudge.sh- No notification? Check System Settings > Notifications > Script Editor (or Terminal). Ensure notifications are allowed.
- "Claude unavailable"? Make sure
claudeis in your PATH or set theCLAUDEenv var to the full path. - macOS Focus/DND will suppress notifications. The nudge still logs to
~/.claude/logs/priority-nudge.log. - Check logs:
tail -f ~/.claude/logs/priority-nudge.logand~/.claude/logs/priority-nudge-stderr.log(if using launchd).
The script works with any markdown file, but nudges are best when your log uses bullet journal notation.
•Task*Priority√Task complete>Task migrated (moved forward)<Task scheduled (moved to calendar)–Note○Event!Idea?Explore=Sentiment
| Symbol | Meaning |
|---|---|
• |
Task (to do) |
√ |
Task (completed) |
* |
Task (priority) |
> |
Migrated (moved to another day) |
< |
Scheduled (added to calendar) |
~~struck~~ |
Cancelled / irrelevant |
○ |
Event |
– |
Note / observation |
! |
Inspiration / great idea |
? |
Explore / research later |
= |
Sentiment / feeling |
## Meetings
- ○ 7:00 AM: Standup and Learnings
- ○ 9:30 AM: Jane / John
- ○ 12:30 PM: Lunch
- ○ 1:00 PM: AI Workflow Shareout
---
# Daily Log
- `>` [TASK-1](https://example.com/issue/TASK-1) Sync — PR ready, may escalate to L1
- `-` In stand up Jane asked to ==move to Friday== for product review
- `•` [TASK-2](https://example.com/issue/TASK-2) Export — awaiting repro info from John
- `-` Demo of bug reproduction and fix
- `-` Learned need to run same db for same seed and setup for main and bugfix branch
- `√` John provided confirmation
- `-` "it's related to duplicate names"
- `√` [PR #42](https://example.com/pull/42) review for Jane — [TASK-3](https://example.com/issue/TASK-3) Index Page
- `•` Start (hand off from Jane) [TASK-3](https://example.com/issue/TASK-3) Index PageThe script's prompt looks for:
- Meetings starting within 60 minutes (the
○event bullets) - Focus items wrapped in
==double equals==(e.g.==move to Friday==) - Fallback to the most important pending
•task