Repository navigation
Add TrackTimer extension - #31280
Add TrackTimer extension#31280pfista wants to merge 4 commits into
Conversation
|
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. |
|
0xdhrv
left a comment
There was a problem hiding this comment.
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
navigationTitleon the root command — it already shows the command title. Insrc/timer-form.tsx,create-timermounts 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:
launchCommandcan throw (for example when the target command is disabled). Please wrap the calls insrc/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
subtitleto 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.
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, andtimers: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
Checklist
npm run buildand tested this distribution build in Raycast — build passed; production was tested in the development installation.assetsfolder are used by the extension itselfREADMEare located outside the metadata folder if they were not generated with our metadata tool — README contains no embedded screenshot assets.