{"id":38825869,"url":"https://github.com/niemet0502/guma","last_synced_at":"2026-01-17T13:12:23.852Z","repository":{"id":222033832,"uuid":"672376616","full_name":"niemet0502/guma","owner":"niemet0502","description":"Lightweight and Self Hosted project management app Built with Microservices architecture, GraphQL Federation, React and Observability","archived":false,"fork":false,"pushed_at":"2024-04-14T01:00:39.000Z","size":1985,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-04-14T03:04:46.245Z","etag":null,"topics":["docker","github-actions","go","graphql","issue-tracker","microservice","nestjs","product-management","project-management","pub-sub","react","redis","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/niemet0502.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}},"created_at":"2023-07-29T21:38:30.000Z","updated_at":"2024-04-15T16:59:23.096Z","dependencies_parsed_at":"2024-04-15T17:09:44.089Z","dependency_job_id":null,"html_url":"https://github.com/niemet0502/guma","commit_stats":null,"previous_names":["niemet0502/neka","niemet0502/guma"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/niemet0502/guma","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niemet0502%2Fguma","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niemet0502%2Fguma/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niemet0502%2Fguma/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niemet0502%2Fguma/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/niemet0502","download_url":"https://codeload.github.com/niemet0502/guma/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niemet0502%2Fguma/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28508976,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T11:50:55.898Z","status":"ssl_error","status_checked_at":"2026-01-17T11:50:55.569Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["docker","github-actions","go","graphql","issue-tracker","microservice","nestjs","product-management","project-management","pub-sub","react","redis","spring-boot"],"created_at":"2026-01-17T13:12:23.755Z","updated_at":"2026-01-17T13:12:23.817Z","avatar_url":"https://github.com/niemet0502.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Guma\n\n## 🖖 What is Guma ?\n\nIf you are a League of legends fan you already know [Gumayusi](https://en.wikipedia.org/wiki/Gumayusi) but if you don't He is a League of Legends esports player, currently bot laner for T1 and 2023 LOL world champion. My fav player.\n\n### In this context\n\nGuma is a Lightweight and Self Hosted project management app highly inspired by [Linear](https://linear.app/), [Plane](https://plane.so/) and [Jira](https://www.atlassian.com/fr/software/jira) that allows to manage multiple projects.\n\n### 🚨Warning 🚨\nI built Guma to apply things i have learned about building microservices. I will use it for my own  (to track my projects) so if you trust me enough you can use the version hosted on my server but if you don't you can self-host the project on your own infrastructure.  \n\nI will keep improving the code base by adding new features or new practices i will learn in the feature. \n\n## 🚀 Features \nGuma provides the features below: \n\n- **Issues:** Track and manage all tasks, bugs, and feature requests. Create, assign, prioritize, and monitor issues. \n- **Sprints:** Implement Agile methodologies by organizing work into time-boxed sprints. Plan, track, and review sprint progress. \n- **Documents:**\n- **Modules:** Organize and manage different project components or functional areas. Break down projects into manageable parts to maintain focus and alignment.\n- **Dashboard:** Get a comprehensive overview of project status and key metrics.\n\n## 🛠️ Overall architecture\n\n\u003cimg src=\"/screenshots/architecture.png\" alt=\"overall architecture\"\u003e\n\n### Services\n\n\u003e **Note: Each project in the monorepo contains its own architecture details which you can refer to.**\n\nName\t| Path\t| Stack\t|  Description  |\n------------- | -------------------- | ------------- | ----------- |\nFrontend\t| [/frontend](/frontend)\t| [React](https://react.dev/)  |  The frontend app\t|  |\nGateway\t| [/gateway](/gateway)\t| [Nestjs](https://nestjs.com/)  |  Gateway built with GraphQL Federeration\t|  | \t\nIdentity\t| [/backend-services/users](/backend-services/users)\t| [NestJS](https://nestjs.com/) |  Service responsible of auth and users handling\t|\nProject\t| [/backend-services/project](/backend-services/organization)\t| [NestJS](https://nestjs.com/) | Service responsible for project handling\t|\nTeam\t| [/backend-services/team](/backend-services/team)\t| [NestJS](https://nestjs.com/) |  Service responsible for team, workflow and members     handling\t|\nIssues\t| [/backend-services/issues](/backend-services/issues)\t| [NestJS](https://nestjs.com/) |  Service responsible for handling everything related to tasks, sprints, reminders etc.\t|\nWiki\t| [/backend-services/wiki](/backend-services/wiki/)\t| [NestJS](https://nestjs.com/) |  Service responsible of the wiki part document handling\t|\nNotification\t| [/backend-services/notifications](/backend-services)\t| [NestJS](https://nestjs.com/)  | Service responsible for sending notifications (Push and email)\t| \nData-Access\t| [/backend-services/data-access/](/backend-services/data-access)\t| [NestJS](https://nestjs.com/) |  Service connected to the database and responsible of exposing a REST api\t|\n\n\u003eWe have implemented an anti-pattern here by having only one service connected to the database, all the services need to communicate with that data-access service in order to retrieve the data they need, it has created a [single point of failure](https://www.techtarget.com/searchdatacenter/definition/Single-point-of-failure-SPOF#:~:text=A%20single%20point%20of%20failure%20(SPOF)%20is%20a%20potential%20risk,entire%20system%20to%20stop%20operating.) that we need to fix. \n\n\n### External services\nThe system uses external services\n\nName\t| Role\t|  Description  |\n------------- | ------------ | ----------- |\n[PostgreSQL](https://www.postgresql.org/)\t| Database |  The database for the app\t|\n[Redis](https://redis.io/fr/)\t| Cache\t|   Caching system (in progress)\t|\n| [RabbitMQ](https://www.rabbitmq.com/) | Messaging | For messaging between services\n\n## 👀 Observability \nObservability refers to the ability to understand, measure, and gain insights into the internal state and behavior of a system based on its external outputs. \nFor this project we have setup traces, logs and metrics. The schema below shows the tools we have used. \n\n\u003cimg src=\"/screenshots/observability.png\" alt=\"observability stack\"\u003e\n\nName\t| Role\t|\n------------- | ------------ |\n[Promtail](https://grafana.com/docs/loki/latest/send-data/promtail/)\t| The agent responsible for collecting the logs from the service |\n[Loki](https://grafana.com/oss/loki/)\t| Store the logs forwarded by Promtail\t| \n| [OpenTelemetry](https://opentelemetry.io/) | Responsible for collecting traces and metrics |\n| [Tempo](https://grafana.com/oss/tempo/) | Store the traces |\n| [Prometheus](https://prometheus.io/) | Store the metrics | \n| [Grafana](https://grafana.com/grafana/dashboards/) | Dashboard to visualize all logs, traces and metrics |\n\nAn example of traces: \n\n\u003cimg src=\"/screenshots/traces-exemple.png\" /\u003e\n\n## 👨‍🔧Infrastructure\nOur application infrastructure leverages [Kubernetes](https://kubernetes.io/) to manage and orchestrate all microservices within the same repository. Kubernetes (K8s) is an open-source platform designed to automate deploying, scaling, and operating application containers. By utilizing Kubernetes, we ensure that our microservices are highly available, scalable, and resilient.\n\nAll Kubernetes manifests required to deploy and manage our services are located in the k8s directory of this repository. This directory contains the necessary YAML files to define the desired state of our application components, including:\n\n- Deployments\n- Services\n- ConfigMaps\n- Ingress\n\nFor now each resource is manually created, infra automation will be added using tools like [Terraform](https://www.terraform.io/) or [Pulumni](https://www.pulumi.com/). \n\n## Deployment\nDeploying microservices, with their interdependence, is a much more complex process than deploying a monolithic application. It is really important to have a fully automated infrastructure. We can achieve the following benefits with the Continuous Delivery approach:\n\n- The ability to release software anytime\n- Any build could end up being a release\n- Build artifacts once - deploy as needed\n\nHere is a simple Continuous Delivery workflow, implemented in this project:\n\u003cimg src=\"screenshots/deployment-workflow.png\"\u003e\n\nIn this [configuration](/.github/workflows/), Github Actions builds tagged images for each successful git push in the main branch. So, there are always the latest images for each microservice on [Docker Hub](https://hub.docker.com/) and older images, tagged with git commit hash. It's easy to deploy any of them and quickly rollback, if needed. \nOnce the image has been built and deployed to the registry the job will connect to the server to update the image version used by the [Kubernetes Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/). I know there is no [ArgoCD](https://argo-cd.readthedocs.io/en/stable/) here but i will definitely add it at some point. \n\n\n## Demo\n\n\u003c!-- \u003cdiv style=\"position: relative; padding-bottom: 46.458333333333336%; height: 0;\"\u003e\u003ciframe src=\"https://www.loom.com/embed/67a3a7c00b894e0888702f5da0222a66?sid=b1ee2c48-eadf-48a6-aff5-2a2b87a75304\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"\u003e\u003c/iframe\u003e\u003c/div\u003e --\u003e\n\n\u003cdiv \u003e\n    \u003ca href=\"https://www.loom.com/share/67a3a7c00b894e0888702f5da0222a66\" target=\"_blank\"\u003e\n      \u003cp\u003eGuma - Project management solution - demo - Watch Video\u003c/p\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.loom.com/share/67a3a7c00b894e0888702f5da0222a66\" target=\"_blank\"\u003e\n      \u003cimg style=\"width: 70%; margin-left: 15%\" src=\"https://cdn.loom.com/sessions/thumbnails/67a3a7c00b894e0888702f5da0222a66-with-play.gif\"\u003e\n    \u003c/a\u003e\n  \u003c/div\u003e\n\n## License \nThe tool is available as open source under the terms of the [MIT License](https://opensource.org/license/MIT)\n\n## Built by\n\n- Marius Vincent NIEMET [Twitter](https://twitter.com/mariusniemet05) [LinkedIn](https://www.linkedin.com/in/marius-vincent-niemet-928b48182/) \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniemet0502%2Fguma","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fniemet0502%2Fguma","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniemet0502%2Fguma/lists"}