{"id":38647671,"url":"https://github.com/open-feature/action","last_synced_at":"2026-01-17T09:16:12.262Z","repository":{"id":321971482,"uuid":"1056799105","full_name":"open-feature/action","owner":"open-feature","description":"GitHub Action for OpenFeature","archived":false,"fork":false,"pushed_at":"2025-12-01T23:17:07.000Z","size":274,"stargazers_count":4,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-04T12:28:38.093Z","etag":null,"topics":["actions","ci","feature-flags","github-actions","openfeature"],"latest_commit_sha":null,"homepage":"https://openfeature.dev","language":null,"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/open-feature.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"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":"2025-09-14T20:29:51.000Z","updated_at":"2025-12-02T07:50:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"97a43c80-8fe8-4c0c-b3b5-33ebdd52eec9","html_url":"https://github.com/open-feature/action","commit_stats":null,"previous_names":["open-feature/action"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/open-feature/action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-feature%2Faction","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-feature%2Faction/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-feature%2Faction/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-feature%2Faction/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-feature","download_url":"https://codeload.github.com/open-feature/action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-feature%2Faction/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28505114,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T06:57:29.758Z","status":"ssl_error","status_checked_at":"2026-01-17T06:56:03.931Z","response_time":85,"last_error":"SSL_read: 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":["actions","ci","feature-flags","github-actions","openfeature"],"created_at":"2026-01-17T09:16:10.014Z","updated_at":"2026-01-17T09:16:12.207Z","avatar_url":"https://github.com/open-feature.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD033 --\u003e\n\u003c!-- x-hide-in-docs-start --\u003e\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/open-feature/community/0e23508c163a6a1ac8c0ced3e4bd78faafe627c7/assets/logo/horizontal/white/openfeature-horizontal-white.svg\" /\u003e\n    \u003cimg align=\"center\" alt=\"OpenFeature Logo\" src=\"https://raw.githubusercontent.com/open-feature/community/0e23508c163a6a1ac8c0ced3e4bd78faafe627c7/assets/logo/horizontal/black/openfeature-horizontal-black.svg\" /\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003ch2 align=\"center\"\u003eOpenFeature Action\u003c/h2\u003e\n\u003c!-- x-hide-in-docs-end --\u003e\n\n\u003cp align=\"center\" class=\"github-badges\"\u003e\n  \u003ca href=\"https://github.com/orgs/open-feature/projects/17\"\u003e\n    \u003cimg alt=\"work-in-progress\" src=\"https://img.shields.io/badge/status-WIP-yellow\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://cloud-native.slack.com/archives/C07DY4TUDK6\"\u003e\n    \u003cimg alt=\"Slack\" src=\"https://img.shields.io/badge/slack-%40cncf%2Fopenfeature-brightgreen?style=flat\u0026logo=slack\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/open-feature/action/releases\"\u003e\n    \u003cimg alt=\"GitHub release\" src=\"https://img.shields.io/github/v/release/open-feature/action\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\n    \u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/open-feature/action\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003c!-- x-hide-in-docs-start --\u003e\n\n[OpenFeature](https://openfeature.dev) is an open specification that provides a vendor-agnostic, community-driven API for feature flagging that works with your favorite feature flag management tool or in-house solution.\n\n\u003c!-- x-hide-in-docs-end --\u003e\n\nThe OpenFeature GitHub Action compares OpenFeature flag manifests between your local configuration stored in your git repository, and/or a remote source using the [OpenFeature CLI](https://github.com/open-feature/cli). This action helps teams maintain consistency between their local feature flag configurations and centralized flag management systems. It also enables **Feature-Flag Driven Development** by providing gitops for your feature flags.\n\n## Table of Contents\n\n- [For Different Users](#for-different-users)\n  - [New to Feature Flags?](#new-to-feature-flags)\n  - [DevOps Engineers](#devops-engineers)\n  - [Security Teams](#security-teams)\n  - [Contributors](#contributors)\n- [Use Cases](#use-cases)\n- [Features](#features)\n- [Prerequisites](#prerequisites)\n- [Quick Start](#quick-start)\n- [Inputs \u0026 Outputs](#inputs--outputs)\n- [Usage Examples](#usage-examples)\n- [Manifest Format](#manifest-format)\n- [Testing](#testing)\n- [Troubleshooting](#troubleshooting)\n- [Security](#security)\n- [Support \u0026 Community](#support--community)\n\n## For Different Users\n\n### New to Feature Flags?\n\nFeature flags (also called feature toggles) allow you to control which features are enabled in your application without deploying new code. This action helps you:\n\n- **Track changes** to your feature flag configuration\n- **Prevent drift** between your local configs and production\n- **Review flag changes** in pull requests before they go live\n\n**Quick example:** If you have a feature flag for a new UI design, this action will notify you when someone changes the flag's default value from \"off\" to \"on\", helping you catch unintended changes before deployment.\n\n### DevOps Engineers\n\nThis action integrates seamlessly into CI/CD pipelines to:\n\n- **Automate flag validation** in pull request workflows\n- **Detect configuration drift** between environments\n- **Compare multiple flag providers** or environments directly\n- **Enforce governance** by requiring review of flag changes\n- **Generate audit trails** of all flag modifications\n\n**Recommended setup:** Use both git comparison (to see what changed in your PR) and remote comparison (to check drift from your flag management system). For multi-environment setups, use remote-to-remote comparison to validate consistency.\n\n### Security Teams\n\nUse this action for security and compliance:\n\n- **Configuration drift detection** - Know when local configs diverge from production\n- **Change auditing** - Every flag change is tracked and visible in pull requests\n- **Access control** - Require code review for flag changes just like any other code\n- **Environment consistency** - Ensure development matches production flag states\n\n### Contributors\n\nWant to contribute? This action is built with:\n\n- **GitHub Actions** composite action pattern\n- **OpenFeature CLI** for the heavy lifting\n- **Bash scripts** for orchestration\n- **YAML parsing** for structured output\n\nSee the [Contributing](#contributing) section for development setup.\n\n## Use Cases\n\n- **Pull Request Validation**: Compare flag changes between feature branches and base branches automatically\n- **Branch Comparison**: Validate flag manifest changes during development workflow\n- **Remote Source Validation**: Check if local flag changes align with external flag management systems  \n- **Remote-to-Remote Comparison**: Compare flag configurations between different remote providers or environments\n- **Drift Detection**: Identify when local configurations have diverged from remote configurations\n- **Environment Synchronization**: Ensure consistency across development, staging, and production environments\n- **Multi-Provider Validation**: Compare flag configurations across different feature flag management systems\n- **Compliance Checking**: Verify that flag configurations meet organizational standards\n\n## Features\n\n- 🔍 **Manifest Comparison** - Compare local flag manifests against remote sources OR git branches\n- 🌿 **Git Branch Comparison** - Automatically compare against PR base branches with minimal configuration\n- 🔗 **Smart Mode Detection** - Automatically detects URL vs git mode based on input format\n- 🔐 **Authentication Support** - Secure access to protected flag sources using tokens\n- 📊 **Rich GitHub Integration** - Detailed summaries with change breakdowns in GitHub Action results\n- ⚙️ **Flexible Configuration** - Support for various protocols and git branch comparisons\n- 🛡️ **Error Handling** - Graceful handling of network issues, missing files, and CLI failures\n- 🔧 **CI/CD Ready** - Designed for seamless integration into existing workflows\n- 💬 **Smart PR Comments** - Automatically posts/updates comments on pull requests with differences\n\n## Prerequisites\n\n- **GitHub Actions workflow**\n- **Git repository** with OpenFeature manifest file\n- **For git branch comparison**: `fetch-depth: 0` in your checkout action (to access branch history)\n- **For remote source comparison**: Access to a remote manifest source (URL or provider)\n- **(Optional)** Authentication token for protected sources\n\n\u003e **Note:** The action uses the OpenFeature CLI, which is automatically installed during the workflow run.\n\n## Quick Start\n\n### For Pull Request Workflows (Recommended)\n\nThis is the simplest setup - just compare your changes against the target branch:\n\n```yaml\nname: Validate Flag Changes\non: pull_request\n\njobs:\n  validate-flags:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0  # Required for git comparison\n      \n      - name: Compare flag manifests\n        uses: open-feature/action@v1\n        with:\n          manifest: \"flags.json\"\n          # Automatically compares against PR base branch\n```\n\n### For Remote Source Comparison\n\nCompare your local manifest against a remote flag management system:\n\n```yaml\nname: Check Flag Drift\non: [push, pull_request]\n\njobs:\n  check-drift:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      \n      - name: Compare against production flags\n        uses: open-feature/action@v1\n        with:\n          against: \"https://your-flag-provider.com/api/flags\"\n          manifest: \"flags.json\"\n          auth-token: ${{ secrets.FLAG_PROVIDER_TOKEN }}\n```\n\n## Inputs \u0026 Outputs\n\n### Inputs\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `against` | URL/remote source OR local path for git comparison (optional for PR workflows) | No | - |\n| `manifest` | Path to your local flag manifest file relative to repository root OR URL to remote manifest | No | `flags.json` |\n| `base-branch` | Base branch for git comparison (auto-detected in PRs) | No | - |\n| `auth-token` | Authentication token for accessing protected against sources (use GitHub secrets) | No | - |\n| `manifest-auth-token` | Authentication token for accessing protected manifest sources (use GitHub secrets) | No | - |\n| `cli-version` | OpenFeature CLI version to use | No | `latest` |\n| `against-manifest-path` | Path where the fetched manifest from the against source will be saved locally | No | `against-flags.json` |\n| `strict` | Strict mode - fail the action if differences are found | No | `false` |\n| `post-pr-comment` | Post a comment on the PR when differences are detected | No | `true` |\n\n### Mode Detection\n\nThe action automatically detects the comparison mode based on the `against` input:\n\n- **URL Mode**: When `against` contains a protocol (e.g., `http://`, `https://`, `git://`, `ssh://`, `file://`) or Git SSH format\n- **Git Mode**: When `against` is a local path or omitted entirely\n\n**Git Mode Behavior**:\n\n- If in a pull request context: Uses `$GITHUB_BASE_REF` (the PR's target branch)  \n- If `base-branch` is provided: Uses the specified branch\n- Otherwise: Defaults to `main` branch\n\n### Outputs\n\n| Output | Description |\n|--------|-------------|\n| `has-differences` | Boolean string indicating if differences were found (`\"true\"`/`\"false\"`) |\n| `comparison-result` | Raw comparison output from OpenFeature CLI in YAML format |\n| `against-manifest-path` | File path where the against manifest was saved |\n| `local-manifest-path` | File path of the local manifest (original path or downloaded from URL) |\n| `summary` | Human-readable summary of the comparison result |\n\n## Usage Examples\n\n### Basic Examples\n\n#### Minimal PR Validation\n\n```yaml\n- name: Validate flag changes\n  uses: open-feature/action@v1\n  with:\n    manifest: \"flags.json\"\n```\n\n#### Compare Against Specific Branch\n\n```yaml\n- name: Compare against develop\n  uses: open-feature/action@v1\n  with:\n    manifest: \"flags.json\"\n    base-branch: \"develop\"\n```\n\n#### Compare Against Remote Source\n\n```yaml\n- name: Check against production\n  uses: open-feature/action@v1\n  with:\n    against: \"https://api.flagprovider.com/flags.json\"\n    manifest: \"flags.json\"\n    auth-token: ${{ secrets.FLAG_TOKEN }}\n```\n\n#### Remote-to-Remote Comparison\n\n```yaml\n- name: Compare two remote sources\n  uses: open-feature/action@v1\n  with:\n    manifest: \"https://staging.flagprovider.com/flags.json\"\n    against: \"https://production.flagprovider.com/flags.json\"\n    manifest-auth-token: ${{ secrets.STAGING_TOKEN }}\n    auth-token: ${{ secrets.PRODUCTION_TOKEN }}\n```\n\n### Advanced Examples\n\n#### Strict Mode (Fail on Differences)\n\n```yaml\n- name: Enforce flag sync\n  uses: open-feature/action@v1\n  with:\n    against: \"https://api.flagprovider.com/flags.json\"\n    manifest: \"flags.json\"\n    strict: true\n```\n\n#### Use Comparison Results\n\n```yaml\n- name: Compare manifests\n  id: compare\n  uses: open-feature/action@v1\n  with:\n    against: \"https://api.flagprovider.com/flags.json\"\n    manifest: \"flags.json\"\n\n- name: Notify Slack on differences\n  if: steps.compare.outputs.has-differences == 'true'\n  run: |\n    curl -X POST -H 'Content-type: application/json' \\\n      --data '{\"text\":\"🚨 Flag drift detected: ${{ steps.compare.outputs.summary }}\"}' \\\n      ${{ secrets.SLACK_WEBHOOK }}\n```\n\n#### Multi-Environment Validation\n\n```yaml\nname: Multi-Environment Flag Validation\non: [push, pull_request]\n\njobs:\n  validate-environments:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        environment: [staging, production]\n    \n    steps:\n      - uses: actions/checkout@v4\n      \n      - name: Validate ${{ matrix.environment }}\n        uses: open-feature/action@v1\n        with:\n          against: ${{ secrets[format('FLAG_URL_{0}', upper(matrix.environment))] }}\n          manifest: \"flags.json\"\n          auth-token: ${{ secrets[format('FLAG_TOKEN_{0}', upper(matrix.environment))] }}\n          against-manifest-path: \"${{ matrix.environment }}-flags.json\"\n```\n\n#### Different Manifest Paths\n\n```yaml\n- name: Compare different paths\n  uses: open-feature/action@v1\n  with:\n    manifest: \"new-location/flags.json\"    # Current branch\n    against: \"old-location/flags.json\"     # Base branch\n    base-branch: \"main\"\n```\n\n#### Remote Provider Comparison\n\n```yaml\nname: Compare Flag Providers\non: [push, workflow_dispatch]\n\njobs:\n  compare-providers:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Compare LaunchDarkly vs Flagsmith\n        uses: open-feature/action@v1\n        with:\n          manifest: \"https://app.launchdarkly.com/api/v2/flags/export\"\n          against: \"https://api.flagsmith.com/api/v1/environments/flags/\"\n          manifest-auth-token: ${{ secrets.LAUNCHDARKLY_TOKEN }}\n          auth-token: ${{ secrets.FLAGSMITH_TOKEN }}\n          \n      - name: Compare staging vs production\n        uses: open-feature/action@v1\n        with:\n          manifest: \"https://staging-api.yourcompany.com/flags\"\n          against: \"https://api.yourcompany.com/flags\"\n          manifest-auth-token: ${{ secrets.STAGING_API_TOKEN }}\n          auth-token: ${{ secrets.PRODUCTION_API_TOKEN }}\n          strict: true  # Fail if environments don't match\n```\n\n## Manifest Format\n\nThis action supports OpenFeature manifest files in JSON or YAML format. The manifest format differs from basic feature flag configurations:\n\n### OpenFeature Manifest Format\n\n```json\n{\n  \"flags\": {\n    \"enableNewUI\": {\n      \"state\": \"ENABLED\",\n      \"variants\": {\n        \"on\": true,\n        \"off\": false\n      },\n      \"defaultVariant\": \"off\",\n      \"targeting\": {}\n    },\n    \"featureToggle\": {\n      \"state\": \"ENABLED\", \n      \"variants\": {\n        \"control\": \"control-experience\",\n        \"treatment\": \"new-experience\"\n      },\n      \"defaultVariant\": \"treatment\",\n      \"targeting\": {\n        \"if\": [\n          {\n            \"in\": [\n              {\"var\": \"userId\"},\n              [\"user-1\", \"user-2\"]\n            ]\n          },\n          \"treatment\",\n          \"control\"\n        ]\n      }\n    }\n  }\n}\n```\n\n### Key Properties\n\n- **`state`**: `\"ENABLED\"` or `\"DISABLED\"` - whether the flag is active\n- **`variants`**: Object defining possible values for the flag\n- **`defaultVariant`**: Which variant to use when targeting doesn't match\n- **`targeting`**: JSON Logic rules for determining which variant to serve\n\nFor more details, see the [OpenFeature Flag Configuration Specification](https://openfeature.dev/specification/sections/flag-configuration).\n\n## Testing\n\nThis repository includes comprehensive tests to ensure reliability:\n\n### Test Types\n\n1. **Integration Tests** (`pr-validation.yml`)\n   - **Purpose**: Real-world testing that simulates actual usage\n   - **What it tests**: Both git comparison and remote source comparison\n   - **When it runs**: On PRs that modify `flags.json`\n\n2. **Feature Tests** (`test.yml`)\n   - **Purpose**: Test individual features and error handling\n   - **What it tests**: Different manifest scenarios, CLI versions, error conditions\n   - **When it runs**: On pushes and PRs\n\n3. **Git Mode Tests** (`test-git-mode.yml`)\n   - **Purpose**: Specifically test git branch comparison functionality\n   - **What it tests**: Branch detection, path mapping, minimal configuration\n   - **When it runs**: On flag changes and workflow modifications\n\n### Running Tests Locally\n\nYou can test this action locally using [act](https://github.com/nektos/act):\n\n```bash\n# Test the basic functionality\nact -j test-action\n\n# Test git mode functionality  \nact -j test-git-mode\n\n# Test with a specific event\nact pull_request -e .github/workflows/pr-validation.yml\n```\n\n### Test Scenarios Covered\n\n- ✅ **Added flags**: Local manifest has flags not in remote\n- ✅ **Removed flags**: Remote has flags not in local manifest  \n- ✅ **Modified flags**: Same flags with different configurations\n- ✅ **Identical manifests**: No differences detected\n- ✅ **Mixed changes**: Complex scenarios with multiple types of changes\n- ✅ **Error handling**: Missing files, network issues, invalid manifests\n- ✅ **CLI versions**: Compatibility with different OpenFeature CLI versions\n- ✅ **Authentication**: Token-based access to protected sources\n\n## Troubleshooting\n\n### Common Issues\n\n#### \"CLI installation failed\"\n\n1. Check if the specified CLI version exists in [OpenFeature CLI releases](https://github.com/open-feature/cli/releases)\n2. Verify network connectivity to GitHub from your runner\n3. Try using `cli-version: \"latest\"` to get the most recent version\n\n#### \"Failed to pull manifest from against source\"\n\n1. Verify the `against` URL is accessible and returns valid JSON/YAML\n2. Check if authentication is required:\n\n   ```yaml\n   auth-token: ${{ secrets.FLAG_SOURCE_TOKEN }}\n   ```\n\n3. Test the URL manually:\n\n   ```bash\n   curl -H \"Authorization: Bearer YOUR_TOKEN\" \"your-against-url\"\n   ```\n\n#### \"Manifest file not found\"\n\n1. Verify the manifest file exists at the specified path\n2. Check the file path is relative to the repository root\n3. For git comparisons, ensure the file exists in the target branch\n\n#### Git Comparison Issues\n\n1. Ensure `fetch-depth: 0` is set in your checkout action\n2. Verify the target branch exists and is accessible\n3. Check that the manifest path exists in both branches\n\n### Debug Mode\n\nEnable debug logging by setting `ACTIONS_STEP_DEBUG` secret to `true` in your repository.\n\n## Security\n\n### Best Practices\n\n#### Authentication Tokens\n\n1. **Always use GitHub Secrets** for authentication tokens:\n\n   ```yaml\n   auth-token: ${{ secrets.FLAG_SOURCE_TOKEN }}  # ✅ Good\n   auth-token: \"abc123xyz\"                       # ❌ Never hardcode\n   ```\n\n2. **Use environment-specific secrets**:\n\n   ```yaml\n   auth-token: ${{ secrets[format('TOKEN_{0}', matrix.environment)] }}\n   ```\n\n3. **Limit token permissions** to read-only access when possible\n4. **Rotate tokens regularly** and update GitHub secrets accordingly\n\n#### Workflow Security\n\n- Set appropriate permissions:\n\n  ```yaml\n  permissions:\n    contents: read\n    pull-requests: write  # Only if using PR comments\n  ```\n\n- Use specific action versions:\n\n  ```yaml\n  uses: open-feature/action@v1.2.3  # ✅ Specific version\n  uses: open-feature/action@v1      # ❌ Moving tag\n  ```\n\n- Pin CLI versions for reproducible builds:\n\n  ```yaml\n  cli-version: \"v0.3.6\"  # ✅ Pinned version\n  cli-version: \"latest\"  # ❌ May change unexpectedly\n  ```\n\n### Handling Sensitive Data\n\n- Never commit flag configurations with production secrets\n- Use separate manifests for different environments\n- Audit flag changes just like code changes\n- Consider using encrypted manifests for sensitive configurations\n\n## Support \u0026 Community\n\n### Getting Help\n\n- 📖 **Documentation**: [OpenFeature Documentation](https://openfeature.dev/)\n- 🐛 **Bug Reports**: [GitHub Issues](https://github.com/open-feature/action/issues)\n- 💬 **Community Chat**: [CNCF Slack #openfeature](https://cloud-native.slack.com/archives/C0344AANLA1)\n- 🛠️ **CLI Issues**: [OpenFeature CLI Repository](https://github.com/open-feature/cli)\n\n### Community\n\n- **CNCF Slack Channels**:\n  - [#openfeature](https://cloud-native.slack.com/archives/C0344AANLA1) - General discussion\n  - [#openfeature-cli](https://cloud-native.slack.com/archives/C07DY4TUDK6) - CLI-specific topics\n\n- **Regular Meetings**: [Community Calls](https://zoom-lfx.platform.linuxfoundation.org/meetings/openfeature)\n\n- **Social Media**:\n  - Twitter: [@openfeature](https://twitter.com/openfeature)\n  - LinkedIn: [OpenFeature](https://www.linkedin.com/company/openfeature/)\n\n### Contributing\n\nWe welcome contributions! Here's how to get started:\n\n1. **Fork the repository** and create a feature branch\n2. **Make your changes** and add tests if needed\n3. **Test locally** using the test workflows\n4. **Submit a pull request** with a clear description\n\n#### Development Setup\n\n```bash\n# Clone your fork\ngit clone https://github.com/YOUR_USERNAME/action.git\ncd action\n\n# Test your changes\nact -j test-action\n```\n\n#### Code Style\n\n- Use clear, descriptive commit messages\n- Follow existing shell script conventions\n- Add tests for new features\n- Update documentation for any changes\n\n### Support the Project\n\n- ⭐ **Star this repository** to show your support\n- 🐛 **Report bugs** and suggest improvements\n- 📝 **Contribute** code, documentation, or examples\n- 🗣️ **Share** your experience with the community\n\n### Project Contributors\n\nThanks to all our contributors:\n\n\u003ca href=\"https://github.com/open-feature/action/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=open-feature/action\" alt=\"Pictures of the folks who have contributed to the project\" /\u003e\n\u003c/a\u003e\n\nMade with [contrib.rocks](https://contrib.rocks).\n\n## Compatibility\n\n### GitHub Actions Runners\n\n- **Supported**: `ubuntu-latest`, `ubuntu-22.04`, `ubuntu-20.04`\n- **Requirements**: Go is pre-installed on GitHub-hosted runners\n\n### OpenFeature CLI Versions\n\n- **Default**: Latest stable release\n- **Stable Versions**: v0.3.6, v0.3.5, v0.3.4, etc. ([CLI releases](https://github.com/open-feature/cli/releases))\n- **Version Selection**: Use `cli-version` input to pin a specific version\n- **Format**: Version tags must include the `v` prefix (e.g., `v0.3.6`, not `0.3.6`)\n\n### Manifest Formats\n\n- **JSON** (`.json`) - Recommended for most use cases\n- **YAML** (`.yml`, `.yaml`) - Good for complex configurations\n- **Schema**: Must conform to [OpenFeature manifest schema](https://openfeature.dev/specification/sections/flag-configuration)\n\n## License\n\nThis project is licensed under the Apache License, Version 2.0 - see the [LICENSE](LICENSE) file for details.\n\n---\n\n*Part of the [OpenFeature](https://openfeature.dev/) ecosystem - A [CNCF](https://www.cncf.io/) project*\n\n\u003c!-- x-hide-in-docs-end --\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-feature%2Faction","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopen-feature%2Faction","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopen-feature%2Faction/lists"}