This browser extension automatically adds the current timer value to your total worked time and updates it every minute.
- Project Structure
- Building the Extensions
- Installation
- How it Works
- Development
- License
- Troubleshooting
In Holded's time tracking:
- The running timer is not included in your total worked time
- You only see the accumulated time from previously stopped timers
- To get an accurate total, you must stop the timer
This extension:
- Automatically adds the current timer value to your total worked time
- Updates the total every minute as the timer runs
- Works silently in the background without requiring interaction
- Gives you an accurate real-time view of your total worked hours
- Automatically adds current timer value to total worked time
- Updates the total every minute
- Works within Holded's iframe structure
- Persists across page refreshes
- Runs automatically without requiring user interaction
This project is organized to support both Chrome and Firefox browsers with a webpack-based build system:
holded-time-tracker/
├── src/ # Source code
│ ├── common/ # Shared code between both extensions
│ │ ├── icons/ # Shared icons
│ │ └── core-logic.js # Shared business logic
│ ├── chrome/ # Chrome-specific files
│ │ ├── manifest.json # Chrome manifest (V3)
│ │ ├── background.js # Chrome background script
│ │ └── content.js # Chrome content script
│ └── firefox/ # Firefox-specific files
│ ├── manifest.json # Firefox manifest (V2)
│ ├── background.js # Firefox background script
│ └── content.js # Firefox content script
├── build/ # Build scripts
│ ├── build-chrome.js # Script to build Chrome extension
│ └── build-firefox.js # Script to build Firefox extension
├── scripts/ # Packaging scripts
│ ├── package-chrome.js # Script to package Chrome extension
│ └── package-firefox.js # Script to package Firefox extension
├── dist/ # Build output
│ ├── chrome/ # Chrome build output
│ └── firefox/ # Firefox build output
├── webpack.chrome.config.js # Webpack config for Chrome
├── webpack.firefox.config.js # Webpack config for Firefox
└── README.md # Project documentation
- Node.js (v14 or later)
- npm or yarn
npm install
-
Build both extensions:
npm run build
Or build individually:
npm run build:chrome npm run build:firefox
-
Package the extensions for distribution:
npm run package
Or package individually:
npm run package:chrome npm run package:firefox
The built extensions will be available in the dist
directory:
dist/chrome/
- Chrome extension filesdist/firefox/
- Firefox extension files
The packaged zip files will be available at:
dist/holded-time-tracker-chrome.zip
dist/holded-time-tracker-firefox.zip
- Open Chrome and go to
chrome://extensions/
- Enable "Developer mode" using the toggle in the top right corner
- Click "Load unpacked"
- Select the
dist/chrome
directory - The extension will automatically start working when you visit Holded
- Open Firefox (version 58.0 or later) and go to
about:debugging#/runtime/this-firefox
- Click "Load Temporary Add-on..."
- Navigate to the
dist/firefox
directory and select themanifest.json
file - The extension will automatically start working when you visit Holded
The extension:
- Automatically detects when you're on a Holded page
- Waits for the time tracking interface to load
- Adds the current timer value to your total on first run
- Updates the total every minute with the time difference
- Modify the browser-specific files in the
src/chrome/
orsrc/firefox/
directories - For shared functionality, update the
src/common/core-logic.js
file - Rebuild the extensions using
npm run build
core-logic.js
: Contains shared business logic for time tracking- Browser-specific content scripts: Import and use the shared logic
- Background scripts: Handle extension lifecycle events
This project uses Semantic Versioning (SemVer) for all version numbers. When releasing a new version, you need to update the version number in three files:
package.json
src/chrome/manifest.json
src/firefox/manifest.json
To simplify this process, use the provided version update script:
# Update to version 1.1.0
npm run version 1.1.0
This script will:
- Update all three files with the full semantic version (e.g., 1.1.0)
- Validate that the version follows the SemVer format (X.Y.Z)
- Remind you to create a git tag for the release
Following semantic versioning principles:
- MAJOR version (X) for incompatible API changes
- MINOR version (Y) for new functionality in a backward compatible manner
- PATCH version (Z) for backward compatible bug fixes
This project uses GitHub Actions to automate the release process:
-
Create and push a new tag with the version number:
git tag v1.0.0 git push origin v1.0.0
-
GitHub Actions will automatically:
- Build both Chrome and Firefox extensions
- Package them into zip files
- Create a GitHub release with the zip files attached
- Add installation instructions to the release notes
The workflow is defined in .github/workflows/release.yml
.
If the extension stops working:
- Check if it's enabled in your browser's extensions
- Try refreshing the Holded page
- If issues persist, disable and re-enable the extension
- Check the browser console for any error messages (F12 > Console)
MIT