{"id":19014996,"url":"https://github.com/adfinis/timed","last_synced_at":"2026-04-02T19:02:54.659Z","repository":{"id":239546818,"uuid":"799833160","full_name":"adfinis/timed","owner":"adfinis","description":"Monorepo for the Timed time-tracking application","archived":false,"fork":false,"pushed_at":"2025-07-18T13:26:57.000Z","size":10902,"stargazers_count":15,"open_issues_count":141,"forks_count":11,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-19T05:41:14.314Z","etag":null,"topics":["time-tracking","timed"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adfinis.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-05-13T07:32:25.000Z","updated_at":"2025-07-18T13:27:01.000Z","dependencies_parsed_at":"2024-05-20T12:00:46.332Z","dependency_job_id":"d522b655-3045-441b-a959-5c9d7462d110","html_url":"https://github.com/adfinis/timed","commit_stats":null,"previous_names":["adfinis/timed"],"tags_count":91,"template":false,"template_full_name":null,"purl":"pkg:github/adfinis/timed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adfinis%2Ftimed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adfinis%2Ftimed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adfinis%2Ftimed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adfinis%2Ftimed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adfinis","download_url":"https://codeload.github.com/adfinis/timed/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adfinis%2Ftimed/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267085231,"owners_count":24033673,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-25T02:00:09.625Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["time-tracking","timed"],"created_at":"2024-11-08T19:34:41.013Z","updated_at":"2026-04-02T19:02:54.643Z","avatar_url":"https://github.com/adfinis.png","language":"Python","funding_links":[],"categories":["Personal Time Tracking"],"sub_categories":[],"readme":"# Timed\n\n[![Ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/adfinis/timed-backend)\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)\n\nTimed timetracking software.\n\n## Installation\n\n**Requirements**\n\n- podman or docker\n- podman compose or docker compose\n- pnpm for frontend developement\n\nAfter installing and configuring those requirements, you should be able to run the following\ncommands to complete the installation:\n\nWhen using podman create a `Makefile.local` (ignored by vcs) and add the following lines to it:\n\n```make\nORCHESTRATOR := podman\n```\n\nThen just start the compose setup:\n\n```bash\nmake start\n```\n\nThis brings up complete local installation.\n\nYou can visit it at [https://timed.localhost](https://timed.localhost).\n\nThe API can be accessed at [https://timed.localhost/api/v1](https://timed.localhost/api/v1) and the admin interface at [http://timed.localhost/admin/](http://timed.localhost/admin/).\n\nThe Keycloak admin interface can be accessed at [https://timed.localhost/auth/admin](https://timed.localhost/auth/admin) with the account `admin` and password `admin`\n\n## Development\n\nTo get the application working locally for development, make sure to create a file `.env` with the following content:\n\n```env\nDJANGO_OIDC_CREATE_USER=True\n```\n\nIf you have existing users from the previous LDAP authentication, you want to add this line as well:\n\n```env\nDJANGO_OIDC_USERNAME_CLAIM=preferred_username\n```\n\nMake sure to set your UID in .env\n\n```bash\necho \"UID=$UID\" \u003e\u003e .env\n```\n\nImport some development fixtures to get started:\n\n```bash\nmake loaddata\n```\n\nThe test data includes various users:\n\n- `admin` (Administrator Account)\n- `fritzm`\n- `axels`\n- `lead` (Reviewer for `Company AG \u003e Developement`, supervises `maxm`, `tims` and `janas`)\n- `maxm` (Reviewer for `Company AG \u003e Vocational Training`)\n- `tims` (Supervised by `maxm`)\n- `janas` (Supervised by `maxm`)\n\nWith which you can log into [https://timed.localhost](https://timed.localhost). Their passwords are identical to the username.\n\nThe django-admin interface is at [https://timed.localhost/admin/](https://timed.localhost/admin/), the same users can be used via the `Login with SSO` option.\n\n### Frontend\n\nFirst start the frontend:\n\n```bash\ncd frontend\npnpm install\npnpm run start\n```\n\nYou can now visit your developement server at `http://localhost:4200`\nCode Changes will automatically be applied via live reloading.\n\n### Adding a user\n\nIf you want to add other users with different roles, add them in the Keycloak interface (as they would be coming from your LDAP directory).\nYou will also have to correct their employment in the Django admin interface as it is not correctly set for the moment.\nHead to [https://timed.localhost/admin/](https://timed.localhost/admin/) after having perform a first login with the user.\nYou should see that new user in the `Employment -\u003e Users`.\nClick on the user and scroll down to the `Employments` section to set a `Location`.\nSave the user and you should now see the _Timed_ interface correctly under that account.\n\n### Linting\n\nFor linting you can use the makefile targets\n\n- backend-lint (lint just the backend)\n- backend-lint-fix (lint and fix just the backend)\n- frontend-lint (lint the frontend)\n- frontend-lint-fix (lint and fix the frontend)\n\n### Testing\n\nFor testing you can use the makefile targets\n\n- backend-test (test just the backend)\n- frontend-test (test just the frontend)\n- test (test front- and backend)\n\n## Configuration\n\nFollowing options can be set as environment variables to configure Timed backend in documented [format](https://github.com/joke2k/django-environ#supported-types)\naccording to type.\n\n| Parameter                                    | Description                                                                                                 | Default                                                          |\n| -------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |\n| `DJANGO_ENV_FILE`                            | Path to setup environment vars in a file                                                                    | .env                                                             |\n| `DJANGO_DEBUG`                               | Boolean that turns on/off debug mode                                                                        | False                                                            |\n| `DJANGO_SECRET_KEY`                          | Secret key for cryptographic signing                                                                        | not set (required)                                               |\n| `DJANGO_ALLOWED_HOSTS`                       | List of hosts representing the host/domain names                                                            | not set (required)                                               |\n| `DJANGO_HOST_PROTOCOL`                       | Protocol host is running on (http or https)                                                                 | http                                                             |\n| `DJANGO_HOST_DOMAIN`                         | Main host name server is reachable on                                                                       | not set (required)                                               |\n| `DJANGO_DATABASE_NAME`                       | Database name                                                                                               | timed                                                            |\n| `DJANGO_DATABASE_USER`                       | Database username                                                                                           | timed                                                            |\n| `DJANGO_DATABASE_HOST`                       | Database hostname                                                                                           | db                                                               |\n| `DJANGO_DATABASE_PORT`                       | Database port                                                                                               | 5432                                                             |\n| `DJANGO_OIDC_DEFAULT_BASE_URL`               | Base URL of the OIDC provider                                                                               | http://timed.localhost/auth/realms/timed/protocol/openid-connect |\n| `DJANGO_OIDC_OP_AUTHORIZATION_ENDPOINT`      | OIDC /auth endpoint                                                                                         | {`DJANGO_OIDC_DEFAULT_BASE_URL`}/auth                            |\n| `DJANGO_OIDC_OP_TOKEN_ENDPOINT`              | OIDC /token endpoint                                                                                        | {`DJANGO_OIDC_DEFAULT_BASE_URL`}/token                           |\n| `DJANGO_OIDC_OP_USER_ENDPOINT`               | OIDC /userinfo endpoint                                                                                     | {`DJANGO_OIDC_DEFAULT_BASE_URL`}/userinfo                        |\n| `DJANGO_OIDC_OP_JWKS_ENDPOINT`               | OIDC /certs endpoint                                                                                        | {`DJANGO_OIDC_DEFAULT_BASE_URL`}/certs                           |\n| `DJANGO_OIDC_RP_CLIENT_ID`                   | Client ID by your OIDC provider                                                                             | timed-public                                                     |\n| `DJANGO_OIDC_RP_CLIENT_SECRET`               | Client secret by your OIDC provider, should be None (flow start is handled by frontend)                     | not set                                                          |\n| `DJANGO_OIDC_RP_SIGN_ALGO`                   | Algorithm the OIDC provider uses to sign ID tokens                                                          | RS256                                                            |\n| `DJANGO_OIDC_VERIFY_SSL`                     | Verify SSL on OIDC request                                                                                  | dev: False, prod: True                                           |\n| `DJANGO_OIDC_CREATE_USER`                    | Create new user if it doesn't exist in the database                                                         | False                                                            |\n| `DJANGO_OIDC_USERNAME_CLAIM`                 | Username token claim for user lookup / creation                                                             | sub                                                              |\n| `DJANGO_OIDC_EMAIL_CLAIM`                    | Email token claim for creating new users (if `DJANGO_OIDC_CREATE_USER` is enabled)                          | email                                                            |\n| `DJANGO_OIDC_FIRSTNAME_CLAIM`                | First name token claim for creating new users (if `DJANGO_OIDC_CREATE_USER` is enabled)                     | given_name                                                       |\n| `DJANGO_OIDC_LASTNAME_CLAIM`                 | Last name token claim for creating new users (if `DJANGO_OIDC_CREATE_USER` is enabled)                      | family_name                                                      |\n| `DJANGO_OIDC_BEARER_TOKEN_REVALIDATION_TIME` | Time (in seconds) to cache a bearer token before revalidation is needed                                     | 60                                                               |\n| `DJANGO_OIDC_CHECK_INTROSPECT`               | Use token introspection for confidential clients                                                            | True                                                             |\n| `DJANGO_OIDC_OP_INTROSPECT_ENDPOINT`         | OIDC token introspection endpoint (if `DJANGO_OIDC_CHECK_INTROSPECT` is enabled)                            | {`DJANGO_OIDC_DEFAULT_BASE_URL`}/token/introspect                |\n| `DJANGO_OIDC_RP_INTROSPECT_CLIENT_ID`        | OIDC client id (if `DJANGO_OIDC_CHECK_INTROSPECT` is enabled) of confidential client                        | timed-confidential                                               |\n| `DJANGO_OIDC_RP_INTROSPECT_CLIENT_SECRET`    | OIDC client secret (if `DJANGO_OIDC_CHECK_INTROSPECT` is enabled) of confidential client                    | not set                                                          |\n| `DJANGO_OIDC_ADMIN_LOGIN_REDIRECT_URL`       | URL of the django-admin, to which the user is redirected after successful admin login                       | dev: http://timed.localhost/admin/, prod: not set                |\n| `DJANGO_ALLOW_LOCAL_LOGIN`                   | Enable / Disable login with local user/password (in admin)                                                  | True                                                             |\n| `EMAIL_URL`                                  | Uri of email server                                                                                         | smtp://localhost:25                                              |\n| `DJANGO_DEFAULT_FROM_EMAIL`                  | Default email address to use for various responses                                                          | webmaster@localhost                                              |\n| `DJANGO_SERVER_EMAIL`                        | Email address error messages are sent from                                                                  | root@localhost                                                   |\n| `DJANGO_ADMINS`                              | List of people who get error notifications                                                                  | not set                                                          |\n| `DJANGO_WORK_REPORT_PATH`                    | Path of custom work report template                                                                         | not set                                                          |\n| `DJANGO_SENTRY_DSN`                          | Sentry DSN for error reporting                                                                              | not set, set to enable Sentry integration                        |\n| `DJANGO_SENTRY_TRACES_SAMPLE_RATE`           | Sentry trace sample rate, Set 1.0 to capture 100% of transactions                                           | 1.0                                                              |\n| `DJANGO_SENTRY_SEND_DEFAULT_PII`             | Associate users to errors in Sentry                                                                         | True                                                             |\n| `HURRICANE_REQ_QUEUE_LEN`                    | Django Hurricane's request queue length. When full, the readiness probe toggles                             | 250                                                              |\n| `STATIC_ROOT`                                | Path to the static files. In prod, you may want to mount a docker volume here, so it can be served by nginx | `/app/static`                                                    |\n| `STATIC_URL`                                 | URL path to the static files on the web server. Configure nginx to point this to `$STATIC_ROOT`             | `/static`                                                        |\n\n## Contributing\n\nLook at our [contributing guidelines](CONTRIBUTING.md) to start with your first contribution.\n\n## License\n\nCode released under the [GNU Affero General Public License v3.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadfinis%2Ftimed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadfinis%2Ftimed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadfinis%2Ftimed/lists"}