Browser Extension
Chrome MV3 + Firefox WebExtension — start / stop the Workestra timer from any web app, with Start-timer buttons injected into Jira, Linear, Asana, Notion, GitHub.
Browser Extension
The Workestra browser extension puts a Start-timer button inside the apps you already work in — Jira, Linear, Asana, Notion, GitHub, Trello, and 100+ others. No more tab-switching to start tracking time on a card.
The extension is a separate package living at extensions/browser/ in the Workestra repo. It consumes only the public REST API — same surface external integrations use — so it's also the proof point that the Time module could be extracted into a standalone product later.
Screenshot needed — split view: extension popup (top-right of browser) showing API token field + active timer; and a Jira ticket page with the injected 'Start timer for KAN-123' button.
Install
Chrome / Edge / Brave
- Visit the Chrome Web Store listing (coming soon).
- Click Add to Chrome.
- Pin the extension to the toolbar.
For dev / unpacked install:
cd extensions/browser
npm install
npm run buildThen in Chrome → chrome://extensions → toggle Developer mode → Load unpacked → pick extensions/browser/dist/.
Firefox
- Visit the Firefox Add-ons listing (coming soon).
- Click Add to Firefox.
For dev / temporary install:
cd extensions/browser
npm run buildThen in Firefox → about:debugging → This Firefox → Load Temporary Add-on → pick extensions/browser/dist/manifest.json.
Connect to your workspace
- Click the extension icon to open the popup.
- Workspace URL:
https://app.workestra.com(or your custom domain). - API token: open
https://app.workestra.com/settings/profile→ API tokens → Create token → name it "Browser extension" → copy. - Paste the token into the popup → Connect.
The popup verifies the token by hitting GET /api/v1/time/timer/active. Once connected, the popup shows your active timer (if any) + Start / Stop buttons.
The token is stored in chrome.storage.local and never leaves your browser — it goes only to your workspace URL.
What the extension does
Popup
A minimal Toggl-style popup:
- Active timer — entity icon + description + live elapsed clock + Stop
- Quick start — text input + entity picker + Start
- Click description to navigate to
/time/timerin a new tab.
Content script
On a configured allowlist of domains, the extension injects a Start timer for this page button at a sensible spot:
| App | Button placement | Description pre-fill |
|---|---|---|
| Jira | Issue toolbar | JIRA-123: <summary> |
| Linear | Issue header | LIN-123: <title> |
| Asana | Task header | <task name> |
| Notion | Page header | <page title> |
| GitHub | Issue / PR header | <repo>#<num>: <title> |
| Trello | Card detail | <card name> |
Click → POSTs to /api/v1/time/timer/start with entity_type: 'internal' and the description from the page title. (The extension doesn't try to map external IDs onto Workestra entities — that's a future iteration.)
Background service worker
Long-lived. Maintains a connection to the popup, polls /api/v1/time/timer/active periodically, updates the extension badge with the elapsed minutes when a timer runs.
Keyboard shortcut
Default: Ctrl+Shift+T (Chrome / Firefox / Edge) — toggles the popup. Customize via chrome://extensions/shortcuts.
Allowlist + privacy
The extension only injects scripts on domains you've allowlisted in the popup settings (Settings → Allowlist). Default allowlist:
*.atlassian.net(Jira)linear.appapp.asana.com*.notion.sogithub.comtrello.com
You can add your own domains. The extension never reads page content beyond the title + URL.
Troubleshooting
Button doesn't appear on a page — check that the domain is in your allowlist. Reload the page after adding.
"Unauthorized" when starting a timer — your API token may be revoked or rotated. Open the popup → Settings → re-paste the token.
Multiple timers running across browser + app — the database enforces "at most one running timer per user", so the older one auto-stops. The extension polls every 30s, so the popup may briefly show stale state — refresh the popup.
Want to disable popup tracking on certain sites — Settings → Allowlist → remove the domain.
API surface used
The extension consumes only the public REST API:
GET /api/v1/time/timer/active— poll for the active timerPOST /api/v1/time/timer/start— start a new onePOST /api/v1/time/timer/stop— stop the active onePOST /api/v1/time-entries— log a manual entry from the popupGET /api/v1/time/reports/summary— for the popup's "today / this week" snapshot
No @/modules/* imports, no Supabase client. The same REST surface is what powers Zapier, Make, n8n, and any custom integration you'd write.
Next steps
- Timer — the in-app composer, three views, and idle prompt
- Integrations — the same REST API the extension uses, available to your own scripts
Settings
Workspace defaults — week start, rounding, runaway-timer threshold, auto-submit, default rate, currency, and rate overrides.
Time Pro
Profitability, multi-level approval chains, period locking, payroll export, auto-submit, weekly digests, runaway-timer auto-stop. The paid tier of Time Tracking.