A modern, self-hostable time-tracking application for freelancers, consultants, and small teams. Track time against clients and projects, tag work for context, mark entries as billable, and generate reports you can hand to a client or feed into invoicing.
SolidTrack is built on Symfony 7.2 and the SolidWorx Platform, and ships with a Tabler/Bootstrap UI powered by Symfony UX (Turbo, Live Components, Stimulus).
- Time tracking — one-click start/stop timer, manual entry, and edit-in-place rows. Only one active timer per user at a time.
- Clients & projects — organise work in a Client → Project → TimeEntry hierarchy with cascade-aware deletes.
- Tags — colour-coded tags for cross-cutting context (e.g.
meeting,bugfix,internal). - Billable flag — mark entries as billable/non-billable and filter reports accordingly.
- Dashboard — at-a-glance KPIs, weekly chart, and top-projects breakdown.
- Reports — Summary and Detailed views with filtering by date range, client, project, and tag.
- REST API — full API surface via API Platform 3 for integrations and automation.
- Authentication — email/password login with optional 2FA (toggle in
platform.yaml). - Modern UX — Turbo navigation, Live Components, and Stimulus controllers for a SPA-feel without the SPA.
- Backend: PHP 8.2+, Symfony 7.2, Doctrine ORM, API Platform 3
- Frontend: Webpack Encore, Stimulus, Symfony UX (Turbo, LiveComponent, Chart.js), Tabler / Bootstrap 5, Tom Select, Pickr
- Database: PostgreSQL 15 (default) — SQLite supported for tests
- Tooling: PHPUnit 11, PHPStan, Rector, ECS, Bun (package manager)
- PHP 8.2+ with
ext-ctypeandext-iconv - Composer 2.x
- Bun (used as the JS package manager / script runner — Webpack Encore is the actual bundler)
- PostgreSQL 15+ (or Docker, see below)
- A local checkout of
solidworx/platformat../platformrelative to this repo (resolved via Composerpathrepository)
git clone https://github.com/solidworx/platform.git
git clone https://github.com/solidworx/solidtrack.git
cd solidtrackThe expected layout is:
your-workspace/
├── platform/ # solidworx/platform
└── solidtrack/ # this repo
composer install
bun installThe easiest way is to use the bundled Docker Compose stack:
docker compose up -dThis starts a PostgreSQL 15 container with defaults from compose.yaml. Symfony Flex will write a matching DATABASE_URL into your .env.local on first install — adjust it if you connect to your own database.
bin/console doctrine:migrations:migrate
bin/console app:create-user you@example.com 'a-strong-password'In one terminal:
bun run watchIn another:
symfony serve # or: php -S 127.0.0.1:8000 -t publicOpen http://127.0.0.1:8000, log in, and start tracking time.
| Command | Purpose |
|---|---|
bin/console |
List all Symfony console commands |
bin/console doctrine:migrations:migrate |
Apply pending migrations |
bin/console platform:generate-schema |
Regenerate platform-schema.json (IDE autocomplete for platform.yaml) |
bin/console app:create-user <email> <password> |
Create an admin user |
vendor/bin/phpunit |
Run the test suite |
vendor/bin/phpstan analyse |
Static analysis |
vendor/bin/ecs check --fix |
Code style (required for the file header) |
vendor/bin/rector process --dry-run |
Preview automated refactors |
| Command | Purpose |
|---|---|
bun run dev |
One-off development build |
bun run watch |
Rebuild on file changes |
bun run dev-server |
Encore dev server with HMR |
bun run build |
Production build |
Bun is used only as the package manager and script runner. The bundler is Webpack Encore (
webpack.config.js); do not substitutebun build. Tests run under PHPUnit, notbun test.
SolidTrack uses a unified configuration file, platform.yaml, parsed by the platform bundle. The most common things you'll change:
platform:
name: 'SolidTrack'
version: '0.1.0-dev'
security:
two_factor:
enabled: false # flip to true to enable 2FA
models:
user: App\Entity\User
ui:
icon_pack: tabler
templates:
base: 'layouts/base.html.twig'
login: '@Ui/Security/login.html.twig'Standard Symfony environment variables (database URL, mailer DSN, app secret, etc.) live in .env / .env.local. See the Symfony configuration docs for the full picture.
src/
├── ApiResource/ # API Platform resource definitions
├── Command/ # Console commands (extend Platform\Console\Command)
├── Controller/ # HTTP controllers (extend Platform\Controller\BaseController)
├── Entity/ # Doctrine entities (Client, Project, TimeEntry, Tag, User)
├── Enum/ # PHP enums
├── Form/ # Symfony form types
├── Menu/ # KnpMenu builders
├── Repository/ # Doctrine repositories (extend Platform\Repository\EntityRepository)
└── Twig/ # Twig extensions and components
assets/ # Stimulus controllers and Encore entrypoints
config/ # Symfony bundle and service config
migrations/ # Doctrine migrations (schema-builder API — see CLAUDE.md)
templates/ # Twig templates (layouts/base.html.twig extends @Ui/Layout/base.html.twig)
tests/ # PHPUnit tests
See CLAUDE.md for the platform integration rules and migration conventions that contributors are expected to follow.
vendor/bin/phpunit
vendor/bin/phpunit --filter SomeTest
vendor/bin/phpunit tests/Path/To/SomeTest.phpTests run inside a rolled-back transaction via dama/doctrine-test-bundle, so each test sees a clean database. New test classes must declare #[CoversClass] (enforced by requireCoverageMetadata="true" in phpunit.xml.dist).
Contributions are welcome! Please:
- Fork the repo and create a feature branch.
- Add tests for your change where reasonable.
- Run
vendor/bin/ecs check --fix,vendor/bin/phpstan analyse, andvendor/bin/phpunitbefore opening a PR. - Open a pull request describing the change and its motivation.
See .github/CONTRIBUTING.md and .github/CODE_OF_CONDUCT.md for the full guidelines.
If you discover a security vulnerability, please follow the responsible disclosure process in .github/SECURITY.md rather than opening a public issue.
SolidTrack is released under the MIT License.