{"id":29946170,"url":"https://github.com/golangid/candi","last_synced_at":"2026-04-20T05:08:03.581Z","repository":{"id":36961312,"uuid":"298788285","full_name":"golangid/candi","owner":"golangid","description":"A backend project library \u0026 utilities","archived":false,"fork":false,"pushed_at":"2026-03-26T06:29:17.000Z","size":1948,"stargazers_count":148,"open_issues_count":3,"forks_count":53,"subscribers_count":9,"default_branch":"master","last_synced_at":"2026-03-27T00:14:00.681Z","etag":null,"topics":["backend","clean-architecture","cli","code-generator","framework","golang","library","skeleton-generator"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/golangid/candi","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/golangid.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":"CODEOWNERS","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":"2020-09-26T10:15:51.000Z","updated_at":"2026-03-05T04:07:44.000Z","dependencies_parsed_at":"2023-11-24T09:27:43.306Z","dependency_job_id":"4547c467-4d44-4a58-973b-da8cd0be79b4","html_url":"https://github.com/golangid/candi","commit_stats":null,"previous_names":[],"tags_count":267,"template":false,"template_full_name":null,"purl":"pkg:github/golangid/candi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golangid%2Fcandi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golangid%2Fcandi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golangid%2Fcandi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golangid%2Fcandi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/golangid","download_url":"https://codeload.github.com/golangid/candi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/golangid%2Fcandi/sbom","scorecard":{"id":434551,"data":{"date":"2025-08-11","repo":{"name":"github.com/golangid/candi","commit":"4fdd05ee63f2c5495423dc63bba16882f6a75af2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Maintained","score":4,"reason":"5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":5,"reason":"Found 8/16 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy-binaries.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/golangid/candi/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/golangid/candi/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/golangid/candi/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-binaries.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/golangid/candi/deploy-binaries.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy-binaries.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/golangid/candi/deploy-binaries.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy-binaries.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/golangid/candi/deploy-binaries.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy-binaries.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/golangid/candi/deploy-binaries.yml/master?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3770 / GHSA-vrw8-fxc6-2r93","Warn: Project is vulnerable to: GO-2025-3553 / GHSA-mh63-6h87-95cp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T04:16:21.187Z","repository_id":36961312,"created_at":"2025-08-19T04:16:21.191Z","updated_at":"2025-08-19T04:16:21.191Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32033739,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"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":["backend","clean-architecture","cli","code-generator","framework","golang","library","skeleton-generator"],"created_at":"2025-08-03T05:13:22.683Z","updated_at":"2026-04-20T05:08:03.563Z","avatar_url":"https://github.com/golangid.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Candi, a library and utilities for `Membangun Candi` project in Golang\n\n[![Build Status](https://github.com/golangid/candi/workflows/build/badge.svg)](https://github.com/golangid/candi/actions)\n[![Go Report Card](https://goreportcard.com/badge/github.com/golangid/candi)](https://goreportcard.com/report/github.com/golangid/candi)\n[![codecov](https://codecov.io/gh/golangid/candi/branch/master/graph/badge.svg)](https://codecov.io/gh/golangid/candi)\n[![golang](https://img.shields.io/badge/golang%20%3E=-v1.18-green.svg?logo=go)](https://golang.org/doc/devel/release.html#go1.18)\n\n## Build with :heart: and\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://storage.googleapis.com/agungdp/static/logo/golang.png\" width=\"80\" alt=\"golang logo\" /\u003e\n  \u003cimg src=\"https://storage.googleapis.com/agungdp/static/logo/docker.png\" width=\"80\" hspace=\"10\" alt=\"docker logo\" /\u003e\n  \u003cimg src=\"https://storage.googleapis.com/agungdp/static/logo/rest.png\" width=\"80\" hspace=\"10\" alt=\"rest logo\" /\u003e\n  \u003cimg src=\"https://storage.googleapis.com/agungdp/static/logo/graphql.png\" width=\"80\" alt=\"graphql logo\" /\u003e\n  \u003cimg src=\"https://storage.googleapis.com/agungdp/static/logo/grpc.png\" width=\"160\" hspace=\"15\" vspace=\"15\" alt=\"grpc logo\" /\u003e\n  \u003cimg src=\"https://storage.googleapis.com/agungdp/static/logo/kafka.png\" height=\"80\" alt=\"kafka logo\" /\u003e\n\u003c/p\u003e\n\n\n## Install `CLI`\nFor linux:\n```\n$ wget -O candi https://storage.googleapis.com/agungdp/bin/candi/candi-linux \u0026\u0026 chmod +x candi \u0026\u0026 sudo mv candi /usr/local/bin\n$ candi\n```\n\nFor macOS:\n```\n$ wget -O candi https://storage.googleapis.com/agungdp/bin/candi/candi-osx \u0026\u0026 chmod +x candi \u0026\u0026 mv candi /usr/local/bin\n$ candi\n```\n\nFor windows:\n```\nhttps://storage.googleapis.com/agungdp/bin/candi/candi-x64.exe (64 bit)\nor \nhttps://storage.googleapis.com/agungdp/bin/candi/candi-x86.exe (32 bit)\n```\n\nOr build binary from source:\n```\n$ go install github.com/golangid/candi/cmd/candi@latest\n$ candi\n```\n\nFlag options:\n```\n$ candi --help\nUsage of candi:\n  -add-handler\n        [project generator] add handler in delivery module in service\n  -add-module\n        [project generator] add module in service\n  -init\n        [project generator] init service\n  -init-monorepo\n        [project generator] init monorepo codebase\n  -libraryname string\n        [project generator] define library name (default \"github.com/golangid/candi\"), you can custom set to CANDI_CLI_PACKAGES global environment variable \n  -monorepo-name string\n        [project generator] set monorepo project name (default \"monorepo\")\n  -output string\n        [project generator] directory to write project to (default is service name)\n  -packageprefix string\n        [project generator] define package prefix\n  -protooutputpkg string\n        [project generator] define generated proto output target (if using grpc), with prefix is your go.mod\n  -run\n        [service runner] run selected service or all service in monorepo\n  -scope string\n        [project generator] set scope \n        1 for init service, \n        2 for add module(s), \n        3 for add delivery handler(s) in module, \n        4 for init monorepo codebase, \n        5 for run multiple service in monorepo\n  -service string\n        Describe service name (if run multiple services, separate by comma)\n  -version\n        print version\n  -withgomod\n        [project generator] generate go.mod or not (default true)\n```\n\n\n## Create new service or add module in existing service\n```\n$ candi\n```\n![](https://storage.googleapis.com/agungdp/static/candi/candi.gif)\n\n### The project is generated with this architecture diagram:\n![](https://storage.googleapis.com/agungdp/static/candi/arch.jpg?11)\n\n\n## Build and run service\n```\n$ cd {{service_name}}\n$ make run\n```\nIf include GRPC handler, run `$ make proto` for generate rpc files from proto (must install `protoc` compiler min version `libprotoc 3.14.0`)\n\n## Server handlers example:\n* [**Example REST API in delivery layer**](https://github.com/agungdwiprasetyo/backend-microservices/tree/master/services/user-service/internal/modules/auth/delivery/resthandler/resthandler.go)\n* [**Example gRPC in delivery layer**](https://github.com/agungdwiprasetyo/backend-microservices/blob/master/services/storage-service/internal/modules/storage/delivery/grpchandler/grpchandler.go)\n* [**Example GraphQL in delivery layer**](https://github.com/agungdwiprasetyo/backend-microservices/tree/master/services/user-service/internal/modules/auth/delivery/graphqlhandler)\n\n## Worker handlers example:\n* [**Example Cron worker in delivery layer**](https://github.com/golangid/candi/tree/master/codebase/app/cron_worker) (Static Scheduler)\n* [**Example Kafka consumer in delivery layer**](https://github.com/golangid/candi/tree/master/codebase/app/kafka_worker) (Event Driven Handler)\n* [**Example Redis subscriber in delivery layer**](https://github.com/golangid/candi/tree/master/codebase/app/redis_worker) (Dynamic Scheduler)\n* [**Example Task queue worker in delivery layer**](https://github.com/golangid/candi/tree/master/codebase/app/task_queue_worker)\n* [**Example Postgres event listener in delivery layer**](https://github.com/golangid/candi/tree/master/codebase/app/postgres_worker)\n* [**Example RabbitMQ consumer in delivery layer**](https://github.com/golangid/candi/tree/master/codebase/app/rabbitmq_worker) (Event Driven Handler and Dynamic Scheduler)\n\n## Plugin: [Candi Plugin](https://github.com/golangid/candi-plugin)\n\n## Example microservices project using this library: [Backend Microservices](https://github.com/agungdwiprasetyo/backend-microservices)\n\n## Features\n- Tracing\n  - Using Jaeger for trace distributed system in microservices.\n![](https://storage.googleapis.com/agungdp/static/candi/jaeger_tracing.png)\n\n- Graceful Shutdown for all servers and workers\n\n## Todo\n- [x] ~~Add task queue worker like celery and add UI for manage task queue worker~~ =\u003e https://github.com/agungdwiprasetyo/task-queue-worker-dashboard\n- [ ] Add Documentation\n\n\n## Pronunciation\n`/can·di/` lihat! beliau membangun seribu candi dalam satu malam.\n\n## Contributing\n\nA big thank you to all contributors!\n\n\u003ca href=\"https://github.com/golangid/candi/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contributors-img.web.app/image?repo=golangid/candi\" /\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolangid%2Fcandi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgolangid%2Fcandi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgolangid%2Fcandi/lists"}