Skip to content

Update Local Time Tracker with Pomodoro, Timer Alerts, and Improved Reports - #32176

Draft
yoshinyan wants to merge 12 commits into
raycast:mainfrom
yoshinyan:codex/local-time-tracker-alerts-pomodoro
Draft

yoshinyan wants to merge 12 commits into
raycast:mainfrom
yoshinyan:codex/local-time-tracker-alerts-pomodoro

Conversation

@yoshinyan

@yoshinyan yoshinyan commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Description

Adds optional Pomodoro intervals and a configurable work-timer alert to Local Time Tracker, improves Reports with visual summaries and activity charts. All data stays in Raycast LocalStorage; no dependencies or external services are added.

  • Pomodoro: configurable work, short-break, and long-break intervals. Each next interval starts manually from the menu bar or by reopening Start Work. Completion opens a silent, persistent foreground Raycast window. Work tracking continues through breaks and between intervals; Stop Work ends both, while End Pomodoro ends only the Pomodoro session.
  • Work-timer alert: disabled by default, with a configurable threshold in minutes. Opens a persistent foreground window once per work timer. Delivered reminders stay recorded across restarts, and failed deliveries are retried.
  • Menu bar and Start Work: tomato icon, remaining-time countdown, total tracked time, and a compact finished state. Start Work includes a Pomodoro checkbox and a visible ⌘⇧P toggle action. Background checks run on an approximate 15-second Raycast schedule; overdue intervals wait for manual action after wake or restart.
  • Reports: today, week, and month totals with project/group selection, session counts, project mix, seven-day bars, and 35-day activity. Larger project lists can be expanded. Refresh, show/hide visual summaries, and copy-summary actions are included.

Renames category labels and helpers to project groups while retaining the existing JSON storage keys. Removes the pre-release developer-only default-group fallback. Timer and Pomodoro changes share an OS-backed lock to prevent overlapping reminder operations. README and changelog document reminder behavior and background scheduling limits.

Validation

  • npm test: 48 tests passed, including 9 report visualization tests.
  • npx tsc --noEmit, npm run lint, and npm run build passed.
  • Tests cover notification thresholds and deduplication, failed-delivery retries, manual Pomodoro transitions, restart persistence, cancellation, clock rollback, and cross-process locking.
  • Report visualization tests cover period boundaries, midnight overlaps, project filtering, deleted-project history, empty data, SVG escaping, long Japanese names, and project-list expansion.
  • Raycast UI smoke checks covered foreground completion, reopening Start Work to start the next interval, menu-bar completion updates, report period switching, refresh, and project-list expansion. Report totals were also compared against stored JSON using an independent calculation.

This remains a draft while usage testing continues. The latest report fixes were also verified in Raycast using a separately built UI-test extension with isolated sample data: long Japanese names are abbreviated without overlapping durations, and deleted-project history remains visible in the daily chart when switching between today and month summaries.

Checklist

  • I read the extension guidelines.
  • I read the documentation about publishing.
  • I ran npm run build and tested this distribution build in Raycast.
  • I checked that files in the assets folder are used by the extension itself.
  • I checked that assets used in the README are located outside the metadata folder if they were not generated with the metadata tool. (This README adds no media.)

@raycastbot raycastbot added extension fix / improvement Label for PRs with extension's fix improvements extension: local-time-tracker Issues related to the local-time-tracker extension platform: macOS labels Oct 11, 2026
@raycastbot

raycastbot commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator

Thank you for your contribution! 🎉

🔔 @yoshinyan you might want to have a look.

You can use this guide to learn how to check out the Pull Request locally in order to test it.

📋 Quick checkout commands
BRANCH="codex/local-time-tracker-alerts-pomodoro"
FORK_URL="https://github.com/yoshinyan/raycast-extensions.git"
EXTENSION_NAME="local-time-tracker"
REPO_NAME="raycast-extensions"

git clone -n --depth=1 --filter=tree:0 -b $BRANCH $FORK_URL
cd $REPO_NAME
git sparse-checkout set --no-cone "extensions/$EXTENSION_NAME"
git checkout
cd "extensions/$EXTENSION_NAME"
npm install && npm run dev

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

@raycastbot raycastbot added the OP is author The OP of the PR is the author of the extension label Oct 11, 2026
@greptile-apps

greptile-apps Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[Medium impact] No blocking code issues remain from the previous findings, and no new actionable issues were found.

Summary

This PR adds optional Pomodoro intervals, one-time work-timer alerts, and visual reports while keeping data in Raycast LocalStorage.

  • Pomodoro intervals run beside one continuous work timer.
  • Reports show time totals with visual project and activity charts.
  • Project lists and reports now call categories project groups.

Reviews (3) · Last reviewed commit: "Refresh Reports Store screenshot with sa..." · Reviewed by Greptile

Comment thread extensions/local-time-tracker/src/lib/reminder-lock.ts Outdated
Comment thread extensions/local-time-tracker/src/lib/reminder-service.ts Outdated
Comment thread extensions/local-time-tracker/src/lib/reminders.ts Outdated
Comment thread extensions/local-time-tracker/src/lib/reminder-service.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c87d559. Configure here.

setActiveTimer(startedTimer);
if (usePomodoro && pomodoroEnabled) {
try {
await startPomodoroInterval(startedTimer.id);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pomodoro start races reminder lock

Medium Severity

startTimer launches the menu bar, which takes the reminder lock inside checkReminders, and then startPomodoroInterval needs that same lock. launchCommand resolves when the menu-bar command starts, not when it finishes, so the Start Work plus Pomodoro path can fail with a lock error after the work timer has already begun.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit c87d559. Configure here.

throw new Error("Another reminder operation is running. Try again shortly.");
}
await rmdir(path);
await mkdir(path);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reminder lock recovery is unsafe

Medium Severity

After mkdir hits EEXIST, stat is not ready for the directory to disappear, and stale recovery does rmdir then mkdir without exclusivity. A lock released in that window surfaces as ENOENT, and two recoveries can both enter the critical section.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit c87d559. Configure here.

await launchCommand({ name: "menu-bar", type: LaunchType.Background });
} catch (error) {
await showFailure("Work started, but Pomodoro could not start", error);
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refresh error masks Pomodoro success

Low Severity

startPomodoroInterval and the follow-up menu-bar launchCommand share one try. A refresh failure after a successful start is reported as Pomodoro failing to start, and the start confirmation HUD is skipped even though the interval was saved.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit c87d559. Configure here.

@yoshinyan
yoshinyan force-pushed the codex/local-time-tracker-alerts-pomodoro branch from c87d559 to ab60a48 Compare October 12, 2026 09:08
@yoshinyan yoshinyan changed the title Update Local Time Tracker with Time Alerts and Pomodoro Update Local Time Tracker with Pomodoro, Timer Alerts, and a Report Dashboard Oct 12, 2026
@yoshinyan yoshinyan changed the title Update Local Time Tracker with Pomodoro, Timer Alerts, and a Report Dashboard Update Local Time Tracker with Pomodoro, Timer Alerts, and Improved Reports Oct 12, 2026
@yoshinyan

Copy link
Copy Markdown
Contributor Author

@greptileai review this draft on the latest commit ab60a48.

@yoshinyan
yoshinyan marked this pull request as ready for review October 12, 2026 12:20
@yoshinyan
yoshinyan marked this pull request as draft October 12, 2026 12:28
@yoshinyan

Copy link
Copy Markdown
Contributor Author

@cursor review verbose=true

@yoshinyan

Copy link
Copy Markdown
Contributor Author

@0xdhrv Could you help check or retrigger Cursor Bugbot for this PR when you have a chance?

Greptile reviewed the latest commit (4958964) with a 5/5 score, and all CI checks passed. Cursor's last review is still for c87d559. I retried @cursor review verbose=true in this comment, but so far there is no reaction, request ID, or new Cursor review check. Cursor's public status page currently reports all systems operational: https://status.cursor.com/

Are manual review triggers restricted for external contributors, or could there be a repository integration issue? This PR is currently a draft; this request is just to get Bugbot's latest review.

@0xdhrv
0xdhrv marked this pull request as ready for review October 12, 2026 19:16

@0xdhrv 0xdhrv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @yoshinyan 👋

Thanks for the careful work on this update 🔥 Everything the bots raised is fixed:

  • Reminder lock: the old directory lock with stale-lock recovery is gone. withReminderLock now uses macOS lockf, so the OS releases the lock when its helper exits. That closes the ownership race that both Greptile and Bugbot found.
  • Pomodoro start: startTimer now starts the Pomodoro interval inside the same reminder operation as the new timer, and only refreshes the menu bar afterwards. If the interval fails to start, the new timer is cleared.
  • Menu bar refresh: refreshMenuBar() catches and logs its own errors, so a failed refresh no longer shows up as "Pomodoro failed to start".
  • Alerts: one failed notification no longer blocks the others, and the daily total can't count the session that was just stopped twice.
  • Preferences: you use the generated Preferences type now.

Greptile gives it 5/5. Lint, build and TypeScript pass locally, and all four screenshots pass the framing check.

I didn't find anything blocking in this pass, so this is good to go. Approving now ✅ A few small things you could clean up before it merges:

Should fix

  • Retake metadata/03-reports.png. The mouse pointer sits on the Project Groups section header. Please capture it again with the pointer out of the window, using Window Capture → Save to Metadata.

As mentioned in our docs here ↗

  • Add the Reports changes to the CHANGELOG. The new entry covers alerts and Pomodoro, but it doesn't mention the new Reports dashboard (totals, project mix, 7-day bars, 35-day activity) or the rename from categories to project groups.

Optional

  • The three old Bugbot threads are still open on GitHub even though the code is fixed. You could resolve them with a short note.
  • The dashboard SVG always uses a dark background (#10151e). It's readable, but it will look like a dark card when Raycast is in light mode. Theme-aware colours would fit better there.

Feel free to reach me here or on Slack if anything comes up.

@0xdhrv
0xdhrv marked this pull request as draft October 12, 2026 19:19
@0xdhrv 0xdhrv self-assigned this Oct 12, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

extension fix / improvement Label for PRs with extension's fix improvements extension: local-time-tracker Issues related to the local-time-tracker extension OP is author The OP of the PR is the author of the extension platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants