Skip to content

Add TrackTimer extension - #31280

Draft
pfista wants to merge 4 commits into
raycast:mainfrom
pfista:pfista/add-tracktimer
Draft

pfista wants to merge 4 commits into
raycast:mainfrom
pfista:pfista/add-tracktimer

Conversation

@pfista

@pfista pfista commented Sep 19, 2026 •

Copy link
Copy Markdown

Description

Add TrackTimer for macOS: start and stop timers, restart recent work, and start a timer with a client, project, description, and billable status. The menu-bar command shows the current timer, today's tracked time, or today's earnings with currencies kept separate.

Requires a TrackTimer account and an API token created in TrackTimer Settings with clients:read, projects:read, timers:read, and timers:write. The extension connects directly to https://www.tracktimer.app; the server URL is not configurable. Tokens are stored in a Raycast password preference. Timer mutations use persisted operation IDs for safe retries.

The recent-timer flow was adapted from Toggl Track; upstream MIT attribution and the source commit are recorded in LICENSE and README.

Validation: standalone npm installation, distribution build, TypeScript, and Raycast lint (including screenshot metadata) pass. The author confirmed the production connection works in the development installation. The source repository's 95 Raycast unit tests passed. The separately exported distribution build has not been exercised interactively in Raycast.

Screencast

Running timer and recent work
Start a timer for a selected client and project
Project selection and task description

Checklist

  • I read the extension guidelines
  • I read the documentation about publishing
  • I ran npm run build and tested this distribution build in Raycast — build passed; production was tested in the development installation.
  • 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 our metadata tool — README contains no embedded screenshot assets.

@raycastbot raycastbot added new extension Label for PRs with new extensions platform: macOS labels Sep 19, 2026
@raycastbot

Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

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

Once the PR is approved and merged, the extension will be available on our Store.

@greptile-apps

greptile-apps Bot commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

The PR appears safe to merge. No new issue was found in the changes since the last review.

Summary

TrackTimer adds a macOS Raycast extension for starting, stopping, and restarting work timers. It also adds a menu-bar view for the current timer, today’s tracked time, or earnings split by currency, with saved operation IDs for safe retries.

  • Adds client and project selection for new timers.
  • Shows recent work and the currently running timer.
  • Adds persistent caching and background timer operations.
  • Includes standalone packaging, documentation, and screenshots.

Reviews (4) · Last reviewed commit: "Deduplicate recent TrackTimer entries"

Comment thread extensions/tracktimer/src/timer-form.tsx
Comment thread extensions/tracktimer/src/menu-bar.tsx
Comment thread extensions/tracktimer/src/menu-bar.tsx Outdated
Comment thread extensions/tracktimer/eslint.config.js Outdated
@0xdhrv 0xdhrv self-assigned this Sep 30, 2026

@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 @pfista 👋

Thanks for your contribution 🔥 Really solid TrackTimer integration — idempotent timer mutations, menu-bar modes, and clear README/setup for the API token.

I also checked overlapping Store extensions (Toggl Track, Clockify, etc.). Those target different services, so this is fine as its own extension.

Here's everything I found in this pass:

Blocking

  • issue (blocking): Please don't set navigationTitle on the root command — it already shows the command title. In src/timer-form.tsx, create-timer mounts this form as the root view, so remove:
navigationTitle={startingAt !== undefined ? "Starting Timer…" : "Start Timer"}

Dynamic status is already covered by the Form.Description (“Starting · …s”). Put any pushed-view title via the parent Action.Push if you still need one when opening the form from Start/Stop Timer.

Docs: https://developers.raycast.com/basics/prepare-an-extension-for-store#navigation-title

Should fix

  • issue: launchCommand can throw (for example when the target command is disabled). Please wrap the calls in src/menu-bar.tsx:
try {
  await launchCommand({ name: "index", type: LaunchType.UserInitiated });
} catch (error) {
  await showFailureToast(error, { title: "Could not open Start/Stop Timer" });
}

(and the same for create-timer).

  • suggestion: Since there are several commands, add the service name as a subtitle to each one:
"subtitle": "TrackTimer"

Optional

  • suggestion: You can simplify failure toasts with showFailureToast(error) from @raycast/utils.
  • nit (non-blocking): Screenshots 2 and 3 are very similar (same Start Timer form). Consider swapping one for a different state if you have it.

When the blocking items are done, press Ready for review. I've converted the PR to a draft until then 😊

Feel free to reach me here or on Slack if anything is unclear.

@0xdhrv
0xdhrv marked this pull request as draft September 30, 2026 14:55

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

new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants