{"id":14957719,"url":"https://github.com/threedotslabs/wild-workouts-go-ddd-example","last_synced_at":"2025-05-14T07:08:19.512Z","repository":{"id":37291496,"uuid":"261871717","full_name":"ThreeDotsLabs/wild-workouts-go-ddd-example","owner":"ThreeDotsLabs","description":"Go DDD example application. Complete project to show how to apply DDD, Clean Architecture, and CQRS by practical refactoring.","archived":false,"fork":false,"pushed_at":"2023-07-10T06:53:18.000Z","size":830,"stargazers_count":5610,"open_issues_count":31,"forks_count":517,"subscribers_count":92,"default_branch":"master","last_synced_at":"2025-04-11T01:41:57.282Z","etag":null,"topics":["clean-architecture","cqrs","ddd","firebase","firestore","gcp","go","golang","google-cloud","hexagonal-architecture","refactoring","serverless","terraform"],"latest_commit_sha":null,"homepage":"https://threedots.tech","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ThreeDotsLabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-05-06T20:30:16.000Z","updated_at":"2025-04-10T13:38:43.000Z","dependencies_parsed_at":"2022-06-27T00:04:14.358Z","dependency_job_id":"9195a5f0-6b80-418e-86d2-a7afa3c7e23f","html_url":"https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example","commit_stats":{"total_commits":57,"total_committers":11,"mean_commits":5.181818181818182,"dds":0.543859649122807,"last_synced_commit":"b519c611e9d1248a149c89db9bcf879fd78b1e35"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThreeDotsLabs%2Fwild-workouts-go-ddd-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThreeDotsLabs%2Fwild-workouts-go-ddd-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThreeDotsLabs%2Fwild-workouts-go-ddd-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThreeDotsLabs%2Fwild-workouts-go-ddd-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ThreeDotsLabs","download_url":"https://codeload.github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254092775,"owners_count":22013290,"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","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":["clean-architecture","cqrs","ddd","firebase","firestore","gcp","go","golang","google-cloud","hexagonal-architecture","refactoring","serverless","terraform"],"created_at":"2024-09-24T13:15:24.631Z","updated_at":"2025-05-14T07:08:19.483Z","avatar_url":"https://github.com/ThreeDotsLabs.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Wild Workouts\n\nWild Workouts is an **example Go DDD** project that we created to show how to build Go applications that are **easy to develop, maintain, and fun to work with, especially in the long term!**\n\n*The idea for this series, is to apply DDD by refactoring. This process is in progress! Please check articles, to know the current progress.*\n\nNo application is perfect from the beginning. With over a dozen coming articles, we will uncover what issues you can find in the current implementation. We will also show how to fix these issues and achieve clean implementation by refactoring.\n\n### Articles\n\n#### \"Too modern\" application\n\n1. [**Too modern Go application? Building a serverless application with Google Cloud Run and Firebase**](https://threedots.tech/post/serverless-cloud-run-firebase-modern-go-application/?utm_source=github.com) _[[v1.0]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v1.0)_\n2. [**A complete Terraform setup of a serverless application on Google Cloud Run and Firebase**](https://threedots.tech/post/complete-setup-of-serverless-application/?utm_source=github.com) _[[v1.1]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v1.1)_\n3. [**Robust gRPC communication on Google Cloud Run (but not only!)**](https://threedots.tech/post/robust-grpc-google-cloud-run/?utm_source=github.com) _[[v1.2]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v1.2)_\n4. [**You should not build your own authentication. Let Firebase do it for you.**](https://threedots.tech/post/firebase-cloud-run-authentication/?utm_source=github.com) _[[v1.3]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v1.3)_\n\n#### Refactoring\n\n5. [**Business Applications in Go: Things to know about DRY**](https://threedots.tech/post/things-to-know-about-dry/?utm_source=github.com) _[[v2.0]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.0)_\n6. [**When microservices in Go are not enough: introduction to DDD Lite**](https://threedots.tech/post/ddd-lite-in-go-introduction/?utm_source=github.com) _[[v2.1]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.1)_\n7. [**Repository pattern: painless way to simplify your Go service logic**](https://threedots.tech/post/repository-pattern-in-go/?utm_source=github.com) _[[v2.2]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.2)_\n8. [**4 practical principles of high-quality database integration tests in Go**](https://threedots.tech/post/database-integration-testing/?utm_source=github.com) _[[v2.3]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.3)_\n9. [**Introducing Clean Architecture by refactoring a Go project**](https://threedots.tech/post/introducing-clean-architecture/?utm_source=github.com) _[[v2.4]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.4)_\n10. [**Introducing basic CQRS by refactoring**](https://threedots.tech/post/basic-cqrs-in-go/?utm_source=github.com) _[[v2.5]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.5)_\n11. [**Combining DDD, CQRS, and Clean Architecture**](https://threedots.tech/post/ddd-cqrs-clean-architecture-combined/?utm_source=github.com)\n12. [**Microservices test architecture. Can you sleep well without end-to-end tests?**](https://threedots.tech/post/microservices-test-architecture/?utm_source=github.com) _[[v2.6]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.6)_\n13. [**Repository secure by design: how to sleep better without fear of security vulnerabilities**](https://threedots.tech/post/repository-secure-by-design/?utm_source=github.com)\n14. [**Running integration tests on Google Cloud Build using docker-compose**](https://threedots.tech/post/running-integration-tests-on-google-cloud-build/?utm_source=github.com) _[[v2.7]](https://github.com/ThreeDotsLabs/wild-workouts-go-ddd-example/releases/tag/v2.7)_\n15. *More articles are on the way!*\n\n### Community\n\nWe're building a Discord community focused on modern business applications. It's the place to discuss hard topics, request a review, or ask if something's not clear. [Come join us!](https://discord.gg/kTVsGjPYDn)\n\n### Directories\n\n- [api](api/) OpenAPI and gRPC definitions\n- [docker](docker/) Dockerfiles\n- [internal](internal/) application code\n- [scripts](scripts/) deployment and development scripts\n- [terraform](terraform/) - infrastructure definition\n- [web](web/) - frontend JavaScript code\n\n### Live Demo\n\nThe example application is available at [https://threedotslabs-wildworkouts.web.app/](https://threedotslabs-wildworkouts.web.app/).\n\n### Running locally\n\n```go\n\u003e docker-compose up\n\n# ...\n\nweb_1             |  INFO  Starting development server...\nweb_1             |  DONE  Compiled successfully in 6315ms11:18:26 AM\nweb_1             |\nweb_1             |\nweb_1             |   App running at:\nweb_1             |   - Local:   http://localhost:8080/\nweb_1             |\nweb_1             |   It seems you are running Vue CLI inside a container.\nweb_1             |   Access the dev server via http://localhost:\u003cyour container's external mapped port\u003e/\nweb_1             |\nweb_1             |   Note that the development build is not optimized.\nweb_1             |   To create a production build, run yarn build.\n```\n\n### Google Cloud Deployment\n\n```go\n\u003e cd terraform/\n\u003e make\n\nFill all required parameters:\n\tproject [current: wild-workouts project]:       # \u003c----- put your Wild Workouts Google Cloud project name here (it will be created) \n\tuser [current: email@gmail.com]:                # \u003c----- put your Google (Gmail, G-suite etc.) e-mail here\n\tbilling_account [current: My billing account]:  # \u003c----- your billing account name, can be found here https://console.cloud.google.com/billing\n\tregion [current: europe-west1]: \n\tfirebase_location [current: europe-west]: \n\n# it may take a couple of minutes...\n\nThe setup is almost done!\n\nNow you need to enable Email/Password provider in the Firebase console.\nTo do this, visit https://console.firebase.google.com/u/0/project/[your-project]/authentication/providers\n\nYou can also downgrade the subscription plan to Spark (it's set to Blaze by default).\nThe Spark plan is completely free and has all features needed for running this project.\n\nCongratulations! Your project should be available at: https://[your-project].web.app\n\nIf it's not, check if the build finished successfully: https://console.cloud.google.com/cloud-build/builds?project=[your-project]\n\nIf you need help, feel free to contact us at https://threedots.tech\n```\n\n### Screenshots\n\n![Wild Workouts login](https://threedots.tech/media/serverless-cloud-run-firebase-modern-go-app/login.png \"Logo Title Text 1\")\n![Wild Workouts trainer's schedule](https://threedots.tech/media/serverless-cloud-run-firebase-modern-go-app/schedule.png \"Logo Title Text 1\")\n![Wild Workouts schedule training](https://threedots.tech/media/serverless-cloud-run-firebase-modern-go-app/new-training.png \"Logo Title Text 1\")\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthreedotslabs%2Fwild-workouts-go-ddd-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthreedotslabs%2Fwild-workouts-go-ddd-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthreedotslabs%2Fwild-workouts-go-ddd-example/lists"}