{"id":26036011,"url":"https://github.com/azure/eno","last_synced_at":"2026-06-12T00:01:16.874Z","repository":{"id":224810637,"uuid":"629588766","full_name":"Azure/eno","owner":"Azure","description":"Dynamic configuration management for Kubernetes","archived":false,"fork":false,"pushed_at":"2026-06-08T19:20:01.000Z","size":77029,"stargazers_count":27,"open_issues_count":13,"forks_count":23,"subscribers_count":53,"default_branch":"main","last_synced_at":"2026-06-08T21:14:49.314Z","etag":null,"topics":["azure","deployment","go","kubernetes"],"latest_commit_sha":null,"homepage":"","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/Azure.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"SECURITY.md","support":"SUPPORT.md","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-04-18T16:01:29.000Z","updated_at":"2026-05-26T21:18:12.000Z","dependencies_parsed_at":"2024-05-13T20:26:05.979Z","dependency_job_id":"c4ec54c9-62f4-408a-a37a-d7d1932b25f5","html_url":"https://github.com/Azure/eno","commit_stats":null,"previous_names":["azure/eno"],"tags_count":97,"template":false,"template_full_name":null,"purl":"pkg:github/Azure/eno","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Feno","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Feno/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Feno/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Feno/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Azure","download_url":"https://codeload.github.com/Azure/eno/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Azure%2Feno/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34222709,"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-11T02:00:06.485Z","response_time":57,"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":["azure","deployment","go","kubernetes"],"created_at":"2025-03-07T06:12:16.263Z","updated_at":"2026-06-12T00:01:16.832Z","avatar_url":"https://github.com/Azure.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Eno\n\nDynamic configuration management for Kubernetes.\n\n- 🎹 **Synthesize**: generate manifests dynamically in short-lived pods\n- ♻️ **Reconcile**: apply the generated configurations and rapidly correct any drift\n- 🏃‍➡️ **React**: re-synthesize when input resources are modified\n\n## What is Eno?\n\nEno deploys applications to Kubernetes using any programming language — not just YAML templates.\n\nThe Eno controllers execute your deployment code in short-lived pods and reconcile the results into Kubernetes resources.\nJust print JSON objects to stdout and Eno will handle the rest.\n\n## Docs\n\n- [Synthesis](./docs/synthesis.md)\n- [Reconciliation](./docs/reconciliation.md)\n- [Symphony](./docs/symphony.md)\n\n## Getting Started\n\n### 1. Install Eno\n\n```bash\nexport TAG=$(curl https://api.github.com/repos/Azure/eno/releases | jq -r '.[0].name')\nkubectl apply -f \"https://github.com/Azure/eno/releases/download/${TAG}/manifest.yaml\"\n```\n\n### 2. Create a Synthesizer\n\nSynthesizers model a reusable set of resources, similar to an `apt` package or Helm chart.\n\n\u003e ⚠️ This example uses a simple bash script but real applications should use [Helm](./examples/03-helm-shim), [Go](./examples/02-go-synthesizer/main.go), or [KCL](./pkg/kclshim/) (currently beta-ish) or any other process that implements the [KRM function API](https://github.com/kubernetes-sigs/kustomize/blob/master/cmd/config/docs/api-conventions/functions-spec.md).\n\n```yaml\nkubectl apply -f - \u003c\u003cYAML\napiVersion: eno.azure.io/v1\nkind: Synthesizer\nmetadata:\n  name: getting-started\n  namespace: default\nspec:\n  # Refs are like arguments.\n  # They specify the type of an input required by the\n  # synthesizer without \"binding\" to a particular resource.\n  refs:\n    - key: config\n      resource:\n        group: \"\" # core\n        version: v1\n        kind: ConfigMap\n\n  # Synthesizers are simple containers distributed\n  # as OCI images and executed in short-lived pods\n  image: docker.io/ubuntu:latest\n  command:\n  - /bin/bash\n  - -c\n  - |\n      # Read inputs from stdin\n      replica_count=\\$(sed -n 's/.*\"replicas\":\"\\([^\"]*\\)\".*/\\1/p')\n\n      # Write the resulting KRM resource list to stdout\n      echo '{\n        \"apiVersion\":\"config.kubernetes.io/v1\",\n        \"kind\":\"ResourceList\",\n        \"items\":[\n          {\n            \"apiVersion\":\"apps/v1\",\n            \"kind\":\"Deployment\",\n            \"metadata\":{\n              \"name\":\"my-app\",\n              \"namespace\": \"default\"\n            },\n            \"spec\": {\n              \"replicas\": REPLICA_COUNT,\n              \"selector\": { \"matchLabels\": { \"app\": \"getting-started\" } },\n              \"template\": {\n                \"metadata\": { \"labels\": { \"app\": \"getting-started\" } },\n                \"spec\": {\n                  \"containers\": [{ \"name\": \"svc\", \"image\": \"nginx\" }]\n                }\n              }\n            }\n          }\n        ]\n      }' | sed \"s/REPLICA_COUNT/\\$replica_count/g\"\nYAML\n```\n\n### 3. Create a Composition\n\nCompositions instantiate Synthesizers, similar to installing a package or creating a Helm release.\n\n```yaml\nkubectl apply -f - \u003c\u003cYAML\n  apiVersion: eno.azure.io/v1\n  kind: Composition\n  metadata:\n    name: my-first-composition\n    namespace: default\n  spec:\n    synthesizer:\n      name: getting-started # references the name of the Synthesizer object\n\n    # Bindings assign a specific object to refs exposed by the Synthesizer.\n    # Many compositions can use the one synthesizer while passing unique inputs.\n    bindings:\n      - key: config\n        resource:\n          name: my-first-config\n          namespace: default\n\n---\n\n  apiVersion: v1\n  kind: ConfigMap\n  metadata:\n    name: my-first-config\n    namespace: default\n  data:\n    replicas: \"1\"\nYAML\n```\n\nEno will execute the synthesizer in a short-lived pod and create the resulting resource(s).\n\n```bash\n$ kubectl get composition\nNAME                   SYNTHESIZER       AGE   STATUS   ERROR\nmy-first-composition   getting-started   0s    Ready\n\n$ kubectl get deploy my-app\nNAME     READY   UP-TO-DATE   AVAILABLE   AGE\nmy-app   1/1     1            1           0s\n```\n\n### 4. Resynthesize\n\nEno will automatically \"resynthesize\" the composition when its inputs change.\n\n```bash\nkubectl patch configmap my-first-config --patch '{\"data\":{\"replicas\":\"2\"}}'\n\n$ kubectl get deploy my-app\nNAME     READY   UP-TO-DATE   AVAILABLE   AGE\nmy-app   2/2     2            2           2m\n```\n\n\n## Contributing\n\nThis project welcomes contributions and suggestions.  Most contributions require you to agree to a\nContributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us\nthe rights to use your contribution. For details, visit https://cla.opensource.microsoft.com.\n\nWhen you submit a pull request, a CLA bot will automatically determine whether you need to provide\na CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions\nprovided by the bot. You will only need to do this once across all repos using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft \ntrademarks or logos is subject to and must follow \n[Microsoft's Trademark \u0026 Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fazure%2Feno","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fazure%2Feno","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fazure%2Feno/lists"}