Docs

Browser release contracts

manifest.json is the Chrome development source. scripts/target-manifest.js generates the other manifests; the source tree and extension permissions do not…

manifest.json is the Chrome development source. scripts/target-manifest.js generates the other manifests; the source tree and extension permissions do not branch at runtime for packaging.

Verified compatibility sources

Checked against Mozilla’s Browser Compatibility Data and vendor documentation on 2026-10-12. These are documented API support claims, not evidence of successful Clockoli browser execution.

FeatureFirefoxSafariSource
MV3 backgroundModule background.scripts, modules since 112; no extension service workersbackground.service_worker since 15.4; type: module since 16.4background compatibility
Static content-script world: MAIN12818content script compatibility
optional_host_permissions12815.5optional host compatibility
alarms4514alarms compatibility
scripting / executeScript10215.4scripting compatibility
activeTab4814permission compatibility
Built-in data consentDesktop 140; Android 142Not applicableMozilla consent guidance

The generated desktop Firefox floor is 140.0, because the extension relies on built-in consent instead of adding a custom consent UI for earlier browsers. Safari’s floor is 18.0. Android is not a release target; Firefox lint may report its separate consent floor.

The Firefox declaration uses authenticationInfo, personallyIdentifyingInfo, browsingActivity, and websiteContent, using conservative disclosure categories for extension data. These describe GitHub authentication, identities, selected tracked URLs/titles/times, and imported Clockify content. Rates and invoices stay local; there is no analytics declaration. See Mozilla’s exact manifest keys.

The background audit found no self.registration, clients, skipWaiting, importScripts, service-worker install/activate listeners, or ServiceWorkerGlobalScope dependencies under src/background/. Background module imports, IndexedDB persistence, and WebExtension event registration can therefore retain the same source. This audit does not establish end-to-end Firefox or Safari runtime correctness.

Chrome’s original manifest and ZIP format are preserved. Its existing minimum_chrome_version: 102 predates static MAIN-world support (111 in the linked compatibility data); this release work does not change that existing Chrome contract.

Distribution licensing

Clockoli-owned code is under GPL-3.0-only. Packaging and GitHub Releases work in private repositories, but private release assets are accessible only to those with access. When distributing through public browser stores, provide a matching publicly accessible Clockoli-X.Y.Z-source.zip and the required license notices.

With Apple signing configured, Safari builds produce both a notarized Developer ID app ZIP and a signed .pkg for optional manual submission to Mac App Store Connect. Building or attaching the .pkg to a GitHub Release does not submit anything to Apple’s store. Before actually submitting, check the App Store distribution terms against GPLv3 and obtain any necessary permissions. The native .app and .appex are checked for matching legal files.

Artifacts and verification

FilePurpose
Clockoli-X.Y.Z.zipChrome Web Store upload; extract for Load unpacked
Clockoli-X.Y.Z-firefox.xpiAMO upload or Firefox temporary loading
Clockoli-X.Y.Z-firefox-signed.xpiOptional unlisted AMO-signed file installation
Clockoli-X.Y.Z-source.zipMatching Corresponding Source (public download required for release; also used for AMO review)
Clockoli-X.Y.Z-safari-extension.zipSafari extension sources for Add Temporary Extension…
Clockoli-X.Y.Z-safari-unsigned.zipAd-hoc signed macOS app for Allow Unsigned Extensions
Clockoli-X.Y.Z-safari.zipOptional Developer ID app, notarized and stapled
Clockoli-X.Y.Z-safari.pkgOptional signed package for manual submission via Transporter / App Store Connect

Publishable Chrome, Firefox, and Safari packages use --release-ref X.Y.Z to require a clean Git checkout at the exact release commit. Development builds can omit this flag. The source ZIP is assembled from the same tagged commit.

Extension archives use sorted inventories, fixed timestamps, and byte verification. Safari app archives additionally preserve executable modes and symlinks, including bundle framework links. Native executable/signature bytes depend on Xcode and signing services and are not promised reproducible. No generated files belong in the repository.

Safari app icons are rasterized from tracked src/assets/clockoli.svg using the existing Playwright dependency. The complete macOS app icon catalog includes 512pt @2x (1024px), without scaling up the 128px extension PNG. Apple recommends 512px and 1024px icons in its Safari extension guidance. A complete catalog still requires Xcode asset compilation and App Store validation; image generation alone does not prove acceptance.

For release review, run the commands in CONTRIBUTING.md and inspect each archive with unzip -l. Load the resulting packages in clean profiles, inspect page and background consoles, and exercise Settings, timer start/switch/stop, arbitrary URLs, GitHub canonical tasks, optional Clockify permission, background restart and pending-write recovery. Never substitute lint results for those browser checks.

The release workflow supports dry_run=true on a selected branch and runs a read-only preview automatically for PRs modifying the release workflow. It builds Chrome, Firefox, Safari and matching source archives, verifies the collected release-zip assets and extracts notes from CHANGELOG.md, without creating a GitHub Release or submitting to any browser store. Firefox signing is disabled for previews, and Apple signing/notarization is disabled unless explicitly requested with sign_safari=true and valid Apple credentials.

Tagged pushes and manual dispatches with dry_run=false publish releases. The local release job validates assets, creates a draft, uploads files, and publishes; existing release assets are replaced with --clobber. None of these steps automatically submits packages to browser stores.

The PDF bundle is also rebuilt in CI and tagged release jobs from the exact source archive, and the final patched bytes must match the distributed bundle. See rebuild instructions.

Found something stale? Edit this page or read the code.