{"id":34595963,"url":"https://github.com/tinohertlein/timesheet-wizard","last_synced_at":"2026-06-27T08:01:19.860Z","repository":{"id":103033136,"uuid":"586486685","full_name":"tinohertlein/timesheet-wizard","owner":"tinohertlein","description":"The Timesheet-Wizard is a personal pet project to fetch timesheets from Clockify, transform them to various formats and export them again into other tools","archived":false,"fork":false,"pushed_at":"2026-06-21T08:58:26.000Z","size":15018,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-06-21T09:21:09.681Z","etag":null,"topics":["clockify"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tinohertlein.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-01-08T10:19:45.000Z","updated_at":"2026-06-21T07:59:50.000Z","dependencies_parsed_at":"2026-01-31T12:01:17.044Z","dependency_job_id":null,"html_url":"https://github.com/tinohertlein/timesheet-wizard","commit_stats":null,"previous_names":[],"tags_count":222,"template":false,"template_full_name":null,"purl":"pkg:github/tinohertlein/timesheet-wizard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinohertlein%2Ftimesheet-wizard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinohertlein%2Ftimesheet-wizard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinohertlein%2Ftimesheet-wizard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinohertlein%2Ftimesheet-wizard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tinohertlein","download_url":"https://codeload.github.com/tinohertlein/timesheet-wizard/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinohertlein%2Ftimesheet-wizard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34845749,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"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":["clockify"],"created_at":"2025-12-24T11:39:43.602Z","updated_at":"2026-06-27T08:01:19.854Z","avatar_url":"https://github.com/tinohertlein.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# What is the Timesheet-Wizard?\n\n[![Master branch](https://github.com/tinohertlein/timesheet-wizard/actions/workflows/build_deploy_release_master.yml/badge.svg)](https://github.com/tinohertlein/timesheet-wizard/actions/workflows/build_deploy_release_master.yml)\n\nThe Timesheet-Wizard is a personal pet project to fetch timesheets from [Clockify], transform\nthem to various formats and export them again into other tools.\n\nAs of now, the only target formats that are supported are XLSX, PDF, CSV and JSON, resulting in the\nfollowing main features of Timesheet-Wizard:\n\n- Fetch timesheets from Clockify\n- Generate XLSX files from imported timesheets \u0026 store them\n- Generate PDF files from imported timesheets \u0026 store them\n- Generate CSV files from imported timesheets \u0026 store them\n- Generate JSON files from imported timesheets \u0026 store them\n\n## Motivation\n\nAs a freelance Software-Engineer \u0026 -Architect doing mostly time \u0026 material contracting, tracking my working hours is\nquite essential. To ease this, I'm using [Clockify]. It's an awesome tool with a nice UI that\nallows me to track and also categorize my working hours. Besides supporting some Excel reports out of the box, it also\nprovides an API to export reports in JSON format as well.\n\nTo have the freedom to customize the reports as much as I like and to transfer these reports automatically to\nother tools, I decided to create my own little application allowing me to do that: the Timesheet-Wizard.\n\nIn addition to the business motivation mentioned above, this is also a perfect opportunity to play around with\n[Function as a service]. That's the\nreason why the Timesheet Wizard is bundled and deployed to multiple [Hyperscalers].\n\n## Documentation\n\nMore verbose documentation of the architecture following [arc42] can be found in the [doc-folder](docs/README.md).\n\n### TL;DR\n\n#### The Timesheet-Wizard is\n\n- written in [Kotlin]\n- setup with [Gradle]\n- deployed continuously using [GitHub Actions]\n- using [Infrastructure as code] for provisioning cloud resources\n\n| App                                          | Built with                                  | Deployed to                                 | Provisioned with |\n|----------------------------------------------|---------------------------------------------|---------------------------------------------|------------------|\n| [**tw-app-aws**](./tw-app-aws/README.md)     | -                                           | [AWS Lambda]                                | [CloudFormation] |\n| [**tw-app-azure**](./tw-app-azure/README.md) | [![SpringBoot][SpringBoot]][SpringBoot-url] | [Azure Functions]                           | [Azure Bicep]    |\n| [**tw-app-gcp**](./tw-app-gcp/README.md)     | [![Quarkus][Quarkus]][Quarkus-url]          | [Google Cloud Functions]                    | [Terraform]      |\n| [**tw-app-local**](./tw-app-local/README.md) | -                                           | No cloud deployment. Just a simple CLI app. | -                |\n\n![Technical context](docs/assets/readme-context-technical.drawio.png \"Technical context\")\n*Technical context*\n\n#### The Timesheet-Wizard consists of six Gradle subprojects:\n\n- **tw-spi**: the service provider interface to be implemented for any cloud specific things. Like e.g. uploading\n  timesheets to some cloud storage.\n- **tw-core**: the code module that contains the business logic. This subproject is cloud-agnostic to switch cloud\n  vendors (e.g. AWS, Azure, GCP, ...) easily. This subproject is also\n  framework-agnostic to switch web frameworks (e.g. Spring Boot, Quarkus,...) easily.\n- **tw-app-aws**: implements the interfaces defined in `tw-spi` with AWS specific code and also bundles the `tw-core`\n  with AWS specific things to an AWS Lambda function.\n- **tw-app-azure**: implements the interfaces defined in `tw-spi` with Azure specific code and also bundles the\n  `tw-core` with Azure specific things to a Spring Boot Azure Function.\n- **tw-app-gcp**: implements the interfaces defined in `tw-spi` with Google Cloud specific code and also bundles the\n  `tw-core` with Google Cloud specific things to a Quarkus Google Cloud Function.\n- **tw-app-local**: implements the interfaces defined in `tw-spi` with local file system code and also bundles the\n  `tw-core` to a jar file that can be executed locally with `java -jar`.\n\nThe `tw-core` Gradle subproject contains two Kotlin packages without any dependencies on each other, having the\nfollowing responsibilities:\n\n**importing**\n\n- importing timesheets from Clockify\n- transforming them into the domain model\n\n**exporting**\n\n- generating XLSX, PDF, CSV \u0026 JSON files from the domain model\n- storing the XLSX, PDF, CSV \u0026 JSON files in the cloud\n\nThere is a third package '**anticorruption**', which is building the bridge between the other two packages by observing\nand sending application events.\n\n![Building blocks](docs/assets/readme-static.drawio.png \"Building blocks\")\n*Building blocks*\n\n## Getting started\n\n### Prerequisites\n\n* [Java 21+]\n* [Gradle]\n* [Docker] - for tests using [Testcontainers]\n\n### Build \u0026 test\n\n`gradle build`\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\n[arc42]: https://arc42.org/\n\n[GitHub Actions]:https://github.com/features/actions\n\n[Clockify]: https://clockify.me/\n\n[Function as a service]: https://en.wikipedia.org/wiki/Function_as_a_service/\n\n[Infrastructure as code]: https://en.wikipedia.org/wiki/Infrastructure_as_code/\n\n[Hyperscalers]: https://en.wikipedia.org/wiki/Hyperscale_computing/\n\n[AWS Lambda]: https://aws.amazon.com/de/lambda/\n\n[Azure Functions]: https://learn.microsoft.com/en-us/azure/azure-functions/functions-overview?pivots=programming-language-java\n\n[Google Cloud Functions]: https://cloud.google.com/functions/\n\n[Kotlin]: https://img.shields.io/badge/Kotlin-20232A?style=for-the-badge\u0026logo=kotlin\n\n[Kotlin-url]: https://kotlinlang.org/\n\n[Quarkus]: https://img.shields.io/badge/Quarkus-20232A?style=for-the-badge\u0026logo=quarkus\n\n[Quarkus-url]: https://quarkus.io/\n\n[SpringBoot]: https://img.shields.io/badge/SpringBoot-20232A?style=for-the-badge\u0026logo=springboot\n\n[SpringBoot-url]: https://spring.io/projects/spring-boot/\n\n[Java 21+]: https://www.oracle.com/de/java/technologies/downloads/\n\n[Gradle]: https://gradle.org/\n\n[Docker]: https://www.docker.com/\n\n[Testcontainers]: https://testcontainers.com/\n\n[CloudFormation]: https://aws.amazon.com/en/cloudformation/\n\n[Azure Bicep]: https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep\n\n[Terraform]: https://www.hashicorp.com/en/products/terraform\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinohertlein%2Ftimesheet-wizard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftinohertlein%2Ftimesheet-wizard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinohertlein%2Ftimesheet-wizard/lists"}