nowo-tech / time-track-bundle
Symfony bundle for personal and team time tracking with browser extension and Tauri desktop agent APIs
Package info
github.com/nowo-tech/TimeTrackBundle
Type:symfony-bundle
pkg:composer/nowo-tech/time-track-bundle
Requires
- php: >=8.2 <8.6
- doctrine/doctrine-bundle: ^2.10 || ^3.0
- doctrine/orm: ^3.7
- nowo-tech/form-kit-bundle: ^2.14
- nowo-tech/ui-kit-bundle: ^2.29
- psr/clock: ^1.0
- psr/log: ^1.1 || ^2.0 || ^3.0
- symfony/clock: ^7.4 || ^8.0
- symfony/config: ^7.4 || ^8.0
- symfony/dependency-injection: ^7.4 || ^8.0
- symfony/form: ^7.4 || ^8.0
- symfony/framework-bundle: ^7.4 || ^8.0
- symfony/http-kernel: ^7.4 || ^8.0
- symfony/routing: ^7.4 || ^8.0
- symfony/security-bundle: ^7.4 || ^8.0
- symfony/translation: ^7.4 || ^8.0
- symfony/twig-bundle: ^7.4 || ^8.0
- symfony/validator: ^7.4 || ^8.0
- symfony/yaml: ^7.4 || ^8.0
- twig/extra-bundle: ^3.12
- twig/string-extra: ^3.12
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- igor-php/igor-php: ^0.10.0
- monolog/monolog: ^3.0
- nowo-tech/phpstan-frankenphp: ^1.0
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-symfony: ^2.0
- phpunit/phpunit: ^10.0
- rector/rector: ^2.0
- symfony/browser-kit: ^7.4 || ^8.0
- symfony/css-selector: ^7.4 || ^8.0
- symfony/http-client: ^7.4 || ^8.0
- symfony/property-access: ^7.4 || ^8.0
- symfony/serializer: ^7.4 || ^8.0
- vincentlanglet/twig-cs-fixer: ^4.0
Suggests
- nowo-tech/task-board-bundle: Integrated task list, ACL, and team/manager context for time tracking.
- symfony/http-client: Calendar suggestions in server mode (Google / Microsoft 365 adapters, since 1.14).
Provides
None
Conflicts
None
Replaces
None
- dev-main
- v1.22.0
- v1.21.0
- v1.20.0
- v1.19.1
- v1.19.0
- v1.18.0
- v1.17.1
- v1.17.0
- v1.16.2
- v1.16.1
- v1.16.0
- v1.15.0
- v1.14.0
- v1.13.0
- v1.12.0
- v1.11.0
- v1.10.3
- v1.10.2
- v1.10.1
- v1.10.0
- v1.9.2
- v1.9.1
- v1.9.0
- v1.8.0
- v1.7.0
- v1.6.0
- v1.5.2
- v1.5.1
- v1.5.0
- v1.4.0
- v1.3.7
- v1.3.6
- v1.3.5
- v1.3.4
- v1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-feat/leave-spec-204
- dev-feat/billable-time-entries
- dev-feat/calendar-oauth-app-provider
- dev-fix/psr-clock-calendar-services
- dev-feat/1.19-block1
- dev-ci/igor-worker-audit
- dev-feat/ddd-ports
- dev-feat/fr008-task-time-move
- dev-fix/1.16.2-ledger-chain
- dev-fix/1.16.1-move-locks
- dev-feat/1.16.0-move-imported-owners
- dev-feat/1.15.0-former-people
- dev-feat/1.13.0-b4-client-api-ui
- dev-feat/1.13.0-b1-model-lock
- dev-feat/1.13.0-b2-balance-ledger
- dev-feat/1.13.0-b3-timesheets
- dev-feat/1.12.0-days-off
- dev-fix/1.12.0-audit-fj-followups
- dev-feat/1.11.0-imported-entries
- dev-chore/symfony-security-2026-11-04
- dev-fix/1.10.3-note-tweaks
- dev-fix/1.10.2-notes
- dev-feat/1.10.1-keep-note-user-can-disable
- dev-fix/flaky-offset-test
- dev-feat/1.10.0-client-api-v0.3
- dev-fix/1.9.2
- dev-fix/req-twig-005
This package is auto-updated.
Last update: 2026-11-12 08:05:35 UTC
README
⭐ Found this useful? Give it a star on GitHub so more developers can find it.
Symfony bundle for personal and team time tracking: one active timer per user, task references via TaskBoardBundle, browser extension API, and Tauri desktop agent API.
This bundle is FrankenPHP worker mode friendly, also with the kernel kept alive and not reset between requests
(FRANKENPHP_RESET_KERNEL=false): see FRANKENPHP-WORKER-AUDIT.md. It works out of the box in a
standard Symfony project, and a DDD / hexagonal host can use it opt-in (USAGE.md).
Features
- Web UI at
/tools/time-track(timer + paginated reports) - Stateless client API for the browser extension and the desktop app (
Bearersession tokens linked to host credentials, scopes, per-request credential and task checks, device flow, rate limits, audit events) — reference - Single active timer per user (409 on conflict)
- Teams and managers v1 via
TeamContextProviderInterface - Task integration via
TaskProviderInterface(designed fornowo-tech/task-board-bundle) - Symfony events for timer start/stop and entry ACL
- Ops:
nowo:time-track:client-tokens:purgefor expired browser/desktop tokens - Working time and timesheets (1.13, opt-in): hours balance and overtime from a host working calendar and worked time (register or task time, labelled), an append-only balance ledger, weekly timesheets with submit / approve / reject and an audited reopen, a hard period lock on every write path, SHA-256 chained audit trails, tenant scopes, the workday / balance / timesheet client API and configurable Twig components (WORKING-TIME.md).
- Calendar suggestions, manual entries and meetings (1.14, opt-in): read-only Google / Microsoft 365 adapters of the
primary calendar (host-held tokens, minimal fields), task-key matching and literal user rules, dailies grouped per
week, suggestions accepted into
calendarentries (lock and overlap aware),POST entries,resolve-keysfor the desktop's local mode, andGET me/meetingsover a host meeting read model with strict privacy filters (CLIENT-API, MEETINGS.md). - Billable entries (1.21): an audited
billablesetter under the edit and period-lock rules, a host default for new entries andPATCH entries/{id}on the client API (USAGE).
Installation
composer require nowo-tech/time-track-bundle
# config/packages/nowo_time_track.yaml nowo_time_track: user_class: App\Entity\User clients: enabled: true
See Installation.
Demo
Integrated demo with TaskBoardBundle (kanban + timer):
make -C demo up-symfony8 # Timer UI: http://localhost:8024/tools/time-track # Demo started at: http://localhost:8024
- Timer UI:
/tools/time-track - Task board:
/tools/task-board - Login:
demo@example.com/demo
|
|
|
End-to-end tests (Playwright, REQ-DEMO-013) and the screenshots:
make -C demo/symfony8 test-e2e # timer page, start / stop, reports make -C demo/symfony8 demo-screenshots # refreshes docs/images/demo/*.webp
With TaskBoard only, configure nowo_time_track.task_provider: nowo_task_board.task_provider — see TaskBoard integration.
Documentation
- Installation
- Configuration
- Usage
- Templates (UiKit page contract)
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
Additional documentation
- Demo with FrankenPHP (includes worker mode)
- GitHub Actions CI requirements
- PSR evaluation (REQ-CS-007)
- Client API reference
- Working time, balance and timesheets
- Meetings API (host guide)
- Browser extension
- Desktop agent (Tauri) —
desktop/tray app - TaskBoard integration
- Roadmap
Tests and coverage
make test
make test-coverage
make release-check
- PHP: 100% lines — controllers, Doctrine repositories and listeners included (functional tests on in-memory SQLite,
tests/Functional/); only pure interfaces are excluded (phpunit.xml.dist) - TS/JS: N/A (desktop agent lives in
desktop/, outside bundle PHP coverage) - Python: N/A
License
MIT — see LICENSE.



