# Kimai Time Tracker

> Track time with Kimai directly from any web page

Canonical page: [https://chrome-stats.com/d/kimai-time-tracker](https://chrome-stats.com/d/kimai-time-tracker)

## Overview

- **ID:** `kimai-time-tracker`
- **Platform:** Firefox
- **Type:** Firefox add-on
- **Status:** Available
- **Publisher:** Jürgen Haas
- **Category:** other
- **Daily users:** 15
- **Weekly downloads:** 2
- **Version:** 0.1.22
- **Last updated:** 2026-05-21
- **First published:** 2026-02-16
- **Size:** 88 KB
- **Data as of:** 2026-09-09
- **Store listing:** [Firefox Add-ons Store](https://addons.mozilla.org/firefox/addon/kimai-time-tracker/)
- **Website:** [https://gitlab.lakedrops.com/jurgenhaas/kimai-bp](https://gitlab.lakedrops.com/jurgenhaas/kimai-bp)

## Description

Kimai Browser Plugin (kimai-bp)

Cross-browser extension for <a href="https://prod.outgoing.prod.webservices.mozgcp.net/v1/e89841d0e910f4959527584fb28c771646fed52dd05720b4a723470ac7d75a48/https%3A//www.kimai.org/" rel="nofollow">Kimai</a> time-tracking. Injects widgets into web pages so you can start and stop timesheets without leaving your browser tab.

Features
<ul><li><strong>Start/stop timers</strong> from any web page via a floating widget or the extension popup</li><li><strong>Platform profiles</strong> — automatic detection of tasks and issues on supported platforms:</li><li>GitLab (18.0+)</li><li>GitHub (2024.1+)</li><li>Jira (9.0+)</li><li><a href="https://prod.outgoing.prod.webservices.mozgcp.net/v1/2a51c5331d69a41dc2a011240976c3fad9daf68530ec6c22a0e796d6a673da37/http%3A//Drupal.org" rel="nofollow">Drupal.org</a> (7.0–11.x)</li><li><strong>Inline track buttons</strong> injected next to detected issues/tasks on supported platforms</li><li><strong>Cascading task picker</strong> — Customer &gt; Project &gt; Activity dropdowns with data fetched from your Kimai instance</li><li><strong>Tag autocomplete</strong> — search and add tags from your Kimai instance</li><li><strong>URL pattern memory</strong> — remembers which customer/project/activity you used for a given URL scope and pre-fills settings on future visits</li><li><strong>Profile auto-updates</strong> — installed platform profiles are checked for updates every 6 hours</li><li><strong>Debug mode</strong> — YAML profile editor with live validation and color-coded DOM overlays for profile development</li><li><strong>Cross-browser</strong> — Chrome (Manifest V3) and Firefox (Manifest V3, 145.0+)</li></ul>
How It Works

The extension has two modes depending on the page you visit:
<ol><li><strong>Profile matched</strong> — When the current page matches an installed platform profile (e.g. a GitLab issue page), compact "Track" buttons are injected next to each detected issue. Clicking a button opens a dialog to select or confirm customer/project/activity settings and starts a Kimai timer with the issue ID and title as the description.</li><li><strong>No profile matched</strong> — A floating widget overlay appears in the corner of the page with a full timer interface: task picker, description field, tag input, and start/stop controls.</li></ol>
The extension popup provides the same timer controls accessible from the toolbar icon on any page.

All Kimai API communication is handled by the background service worker. Content scripts and the popup never call the API directly — they send typed messages to the background, which centralizes authentication and state management.

Installation

From Source

<code>pnpm install
pnpm build:chrome    # Production build for Chrome
pnpm build:firefox   # Production build for Firefox
</code>

<strong>Chrome:</strong> Open <code>chrome://extensions</code>, enable Developer mode, click "Load unpacked", select <code>.output/chrome-mv3</code>.

<strong>Firefox:</strong> Open <code>about:debugging#/runtime/this-firefox</code>, click "Load Temporary Add-on", select <code>.output/firefox-mv3/manifest.json</code>.

Configuration
<ol><li>Click the extension icon and go to <strong>Settings</strong> (or right-click the icon &gt; Options)</li><li>Enter your <strong>Kimai URL</strong> (e.g. <code><a href="https://prod.outgoing.prod.webservices.mozgcp.net/v1/3136a0865c6ba0488ec7a5fe4aa5152f294bd2ebc4fc08d4f7b4d6d95aac034a/https%3A//kimai.example.com" rel="nofollow">https://kimai.example.com</a></code>)</li><li>Enter your <strong>API token</strong> (generated in Kimai under Settings &gt; API)</li><li>Click <strong>Save</strong>, then <strong>Test Connection</strong> to verify</li></ol>
Installing Platform Profiles
<ol><li>Open the extension settings page</li><li>Scroll to <strong>Platform Profiles</strong></li><li>Click <strong>Browse Available</strong> to see profiles from the registry</li><li>Click <strong>Install</strong> next to the profiles for platforms you use</li><li>Add custom domains if your instance uses a self-hosted URL (e.g. <code><a href="https://prod.outgoing.prod.webservices.mozgcp.net/v1/818c82d9ef6714a20c42a9c3564c7cc9fbb4c669c40c21200b2fc8de186b2a2d/http%3A//gitlab.mycompany.com" rel="nofollow">gitlab.mycompany.com</a></code>)</li></ol>
Development

<code>pnpm install          # Install dependencies
pnpm dev              # Dev mode with HMR (Chrome)
pnpm dev:firefox      # Dev mode (Firefox)
pnpm build            # Production build (all browsers)
</code>

Testing

<code>pnpm test             # Run all tests
pnpm test:unit        # Unit tests only (Vitest)
pnpm test:e2e         # E2E tests (Playwright)
</code>

Linting &amp; Type Checking

<code>pnpm lint             # ESLint check
pnpm lint:fix         # ESLint auto-fix
pnpm format           # Prettier format
pnpm format:check     # Prettier check
pnpm typecheck        # TypeScript type checking
</code>

Architecture

<code>src/
├── entrypoints/
│   ├── background.ts       # Service worker — API calls, timer state, profile management
│   ├── content.ts          # Content script — profile detection, track buttons, floating widget
│   ├── popup/              # Extension popup — timer controls, task picker
│   └── options/            # Settings page — connection config, profile &amp; pattern management
├── components/             # Vanilla web components (Shadow DOM)
│   ├── kimai-widget.ts     # Floating overlay (timer + task picker + tags)
│   ├── kimai-popup.ts      # Popup UI
│   ├── kimai-timer.ts      # Live elapsed-time display with start/stop
│   ├── kimai-task-picker.ts        # Customer &gt; Project &gt; Activity dropdowns
│   ├── kimai-tag-input.ts          # Tag autocomplete input
│   ├── kimai-options.ts            # Settings form
│   ├── kimai-profile-manager.ts    # Profile browse/install/update UI
│   ├── kimai-pattern-manager.ts    # URL pattern management UI
│   └── kimai-debug-profile-editor.ts  # YAML profile editor with live validation
├── lib/
│   ├── api/                # Typed Kimai REST API client
│   ├── storage/            # Cross-context state (WXT storage)
│   ├── messages.ts         # Typed message protocol (background &lt;-&gt; content/popup)
│   ├── profiles/           # Profile parsing, matching, and management
│   ├── patterns/           # URL pattern matching and storage
│   └── context/            # Page context analysis (stub)
└── assets/                 # Icons
</code>

Key Design Principles
<ul><li><strong>Background owns all API calls</strong> — content scripts and popup communicate via typed messages; no direct API calls from page context.</li><li><strong>Shadow DOM isolation</strong> — all web components use <code>attachShadow({ mode: 'open' })</code> with inline <code>&lt;style&gt;</code> elements; the floating widget and track dialog are fully isolated from host page styles.</li><li><strong>Zero <code>innerHTML</code></strong> — all DOM is built with <code>document.createElement()</code>, <code>textContent</code>, and <code>appendChild()</code>. No <code>innerHTML</code> assignments anywhere in the build output, ensuring AMO validation compliance.</li><li><strong>Profile-driven detection</strong> — platform support is defined in downloadable YAML profiles, not hard-coded. New platforms can be supported without a new extension release.</li><li><strong>URL pattern memory</strong> — customer/project/activity settings are stored per URL prefix and looked up by walking up the URL path hierarchy.</li></ul>
Tech Stack

| Layer               | Technology                                          |
| ------------------- | --------------------------------------------------- |
| Extension framework | <a href="https://prod.outgoing.prod.webservices.mozgcp.net/v1/090b6d29ceb548653d6d220f29109c30367cf847459e06449172c1947d28f9de/https%3A//wxt.dev/" rel="nofollow">WXT</a> (Vite-based, Manifest V3)   |
| UI components       | Vanilla web components (<code>HTMLElement</code> + Shadow DOM) |
| Language            | TypeScript (strict mode)                            |
| Package manager     | pnpm                                                |
| Testing             | Vitest + Playwright                                 |
| Linting             | ESLint + Prettier                                   |
| State               | <a href="https://prod.outgoing.prod.webservices.mozgcp.net/v1/dff35b07402d12423965bebcde57ff7fd7cbab15c73b2c5d91a7a92869093868/https%3A//wxt.dev/storage" rel="nofollow">@wxt-dev/storage</a>         |
<blockquote><strong>Note:</strong> The extension was originally built with <a href="https://prod.outgoing.prod.webservices.mozgcp.net/v1/91b30688c872a099636f7ce78a50cb446a7a816d97596fde3df262995fb4834a/https%3A//lit.dev/" rel="nofollow">Lit</a> but migrated to vanilla <code>HTMLElement</code>-based web components to eliminate all <code>innerHTML</code> usage from the build output, which is required for Mozilla Add-ons (AMO) validation compliance.</blockquote>
Platform Profiles

Profiles are YAML files that define CSS selectors for detecting trackable items on task/issue management platforms. Each profile specifies:
<ul><li><strong>Domains</strong> — hostnames where the platform is deployed (supports subdomains)</li><li><strong>Selector sets</strong> — one or more contexts (e.g. "detail view", "list view"), each with:</li><li><code>isSupported</code> — gate selector that determines if the page has trackable items</li><li><code>issueId</code> — extracts the issue/task identifier</li><li><code>issueTitle</code> — extracts the issue/task title</li><li><code>itemContainer</code> — (optional) wraps individual trackable items for multi-item pages</li><li><code>widgetAnchor</code> — (optional) where to inject the track button</li></ul>
Profiles support multi-version platforms via multiple selector sets with different gate selectors. The matcher tries each context in order and uses the first one whose gate matches.

Writing a Profile

Enable <strong>Debug Mode</strong> in the extension settings to access the profile editor. Write YAML, set a target domain, and navigate to a page on that domain. Matched elements are highlighted with color-coded overlays:

| Color  | Selector             |
| ------ | -------------------- |
| Green  | <code>isSupported</code> (gate) |
| Blue   | <code>issueId</code>            |
| Purple | <code>issueTitle</code>         |
| Amber  | <code>itemContainer</code>      |
| Red    | <code>widgetAnchor</code>       |

Release Process

<code># 1. Bump version in package.json
# 2. Commit and tag
git add package.json
git commit -m "chore: bump version to X.Y.Z"
git tag vX.Y.Z
git push &amp;&amp; git push --tags

# 3. CI pipeline runs: lint → test → build → package → release
# 4. Manually trigger publish jobs in GitLab CI for Chrome Web Store / Firefox AMO
</code>

License

This project is licensed under the <a href="/" rel="nofollow">GNU General Public License v3.0</a> or later.

## Rankings

- #28,085 — Overall
- #30 — screentime tracker
- #31 — screen time tracker
- #138 — tracker
- #191 — component
- #247 — airtime

## Permissions and access

### Permissions

- `storage`
- `activeTab`
- `alarms`

### Host permissions

- `https://*/*`
- `http://*/*`

### Content script matches

- `<all_urls>`

## Safety

- **Risk impact:** Moderate risk impact
- **Risk likelihood:** Moderate risk likelihood

### Analysis details

- Allows access to all websites, posing a significant security risk as it can monitor and modify data from any visited site.
- This extension has low user count. Unpopular extensions may not be stable or safe.

> Some risk analysis details are omitted from this free response. [Upgrade to view the full analysis](https://chrome-stats.com/pricing).

## Similar extensions and apps

- [Time Tracker Addon for Kimai](https://chrome-stats.com/d/kimai-time-tracker-addon) — 4 users
- [Time Tracker Addon for Kimai](https://chrome-stats.com/d/time-tracker-addon-kimai) — 4 users
- [TrackMate – Jira Time Tracker](https://chrome-stats.com/d/trackmate) — 3 users
- [Tracking Time Button](https://chrome-stats.com/d/time-tracking-button) — 377 users, 2.56 / 5
- [Awesome Time Tracker Pro](https://chrome-stats.com/d/awesome-time-tracker-pro)
- [JSK Task Time Tracker](https://chrome-stats.com/d/jsk-task-time-tracker) — 1 users
- [Timeneye widget](https://chrome-stats.com/d/timeneye-widget) — 133 users, 2.57 / 5
- [Toggl Track: Productivity & Time Tracker](https://chrome-stats.com/d/toggl-button-time-tracker) — 9,563 users, 3.94 / 5
- [Clockify Time Tracker](https://chrome-stats.com/d/clockify-time-tracker) — 7,337 users, 3.32 / 5
- [ChronoTrec](https://chrome-stats.com/d/chronotrec)
- [Browser timer for Active Collab 5](https://chrome-stats.com/d/browser-timer-for-ac5) — 5 users, 3.67 / 5
- [Tracking Timer](https://chrome-stats.com/d/tracking-timer) — 20 users, 5.00 / 5

---

Source: [Chrome-Stats](https://chrome-stats.com/d/kimai-time-tracker)
