{"id":24637938,"url":"https://github.com/upbound/provider-opentofu","last_synced_at":"2026-02-24T02:18:10.376Z","repository":{"id":272279183,"uuid":"852069957","full_name":"upbound/provider-opentofu","owner":"upbound","description":"OpenTofu Crossplane Provider","archived":false,"fork":false,"pushed_at":"2026-02-18T15:50:03.000Z","size":299,"stargazers_count":48,"open_issues_count":30,"forks_count":17,"subscribers_count":16,"default_branch":"main","last_synced_at":"2026-02-18T19:34:40.124Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/upbound.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":"2024-09-04T07:09:06.000Z","updated_at":"2026-02-17T15:16:29.000Z","dependencies_parsed_at":"2025-01-13T12:42:00.158Z","dependency_job_id":"aa47b210-9c61-4bf8-aa54-e5dbd902f6fb","html_url":"https://github.com/upbound/provider-opentofu","commit_stats":null,"previous_names":["upbound/provider-opentofu"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/upbound/provider-opentofu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbound%2Fprovider-opentofu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbound%2Fprovider-opentofu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbound%2Fprovider-opentofu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbound%2Fprovider-opentofu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/upbound","download_url":"https://codeload.github.com/upbound/provider-opentofu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbound%2Fprovider-opentofu/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29769163,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T01:40:24.820Z","status":"online","status_checked_at":"2026-02-24T02:00:07.497Z","response_time":75,"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":[],"created_at":"2025-01-25T10:12:35.992Z","updated_at":"2026-02-24T02:18:10.358Z","avatar_url":"https://github.com/upbound.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenTofu Crossplane Provider\n\nProvider OpenTofu is a [Crossplane](https://crossplane.io/) provider that\ncan run Terraform code (HCL), using the OpenTofu fork, and enables defining new Crossplane Composite Resources (XRs)\nthat are composed of a mix of 'native' Crossplane managed resources and your\nexisting Terraform modules.\n\nThe provider adds support for a `Workspace` managed resource that\nrepresents an OpenTofu workspace. The configuration of each workspace may be\neither fetched from a remote source (e.g. git), or simply specified inline.\n\n```yaml\napiVersion: opentofu.upbound.io/v1beta1\nkind: Workspace\nmetadata:\n  name: example-inline\n  annotations:\n    # The workspace will be named 'coolbucket'. If you omitted this\n    # annotation it would be derived from metadata.name - i.e. 'example-inline'.\n    crossplane.io/external-name: coolbucket\nspec:\n  forProvider:\n    # For simple cases you can use an inline source to specify the content of\n    # main.tf as opaque, inline HCL.\n    source: Inline\n    module: |\n      // All outputs are written to the connection secret.  Non-sensitive outputs\n      // are stored in the status.atProvider.outputs object.\n      output \"url\" {\n        value       = google_storage_bucket.example.self_link\n      }\n\n      resource \"random_id\" \"example\" {\n        byte_length = 4\n      }\n\n      // The google provider and remote state are configured by the provider\n      // config - see examples/providerconfig.yaml.\n      resource \"google_storage_bucket\" \"example\" {\n        name = \"crossplane-example-${opentofu.workspace}-${random_id.example.hex}\"\n      }\n  writeConnectionSecretToRef:\n    namespace: default\n    name: opentofu-workspace-example-inline\n```\n\n```yaml\napiVersion: opentofu.upbound.io/v1beta1\nkind: Workspace\nmetadata:\n  name: example-remote\n  annotations:\n    crossplane.io/external-name: myworkspace\nspec:\n  forProvider:\n    # Use any module source supported by tofu init -from-module. \n    source: Remote\n    module: https://github.com/upbound/tf-example\n    # Environment variables can be passed through\n    env:\n      - name: TF_VAR_varFromValue\n        value: 'value'\n      - name: ENV_FROM_CONFIGMAP\n        configMapKeyRef:\n          namespace: my-namespace\n          name: my-config-map\n          key: target-key\n      - name: ENV_FROM_SECRET\n        secretKeyRef:\n          namespace: my-namespace\n          name: my-secret\n          key: target-key\n    # Variables can be specified inline as a list of key-value pairs or as an json object, or loaded from a ConfigMap or Secret.\n    vars:\n    - key: region\n      value: us-west-1\n    varmap:\n      account:\n        region: us-west-1\n        owners:\n        - example-owner-1\n        - example-owner-2\n    varFiles:\n    - source: SecretKey\n      secretKeyRef:\n        namespace: default\n        name: opentofu\n        key: example.tfvar.json\n  # All outputs are written to the connection secret.\n  writeConnectionSecretToRef:\n    namespace: default\n    name: opentofu-workspace-example-inline\n```\n\n## Getting Started\n\n\u003c!-- TODO Update link --\u003e\nFollow the quick start guide [here](https://marketplace.upbound.io/providers/upbound/provider-opentofu/latest/docs/quickstart).\n\n\u003c!-- TODO Update link --\u003e\nYou can find a detailed API reference for all the managed resources with examples in the [Upbound Marketplace](https://marketplace.upbound.io/providers/upbound/provider-opentofu/latest/managed-resources).\n\n## Further Configuration\n\n\u003c!-- TODO Update link --\u003e\nYou can find more information about configuring the provider further [here](https://marketplace.upbound.io/providers/upbound/provider-opentofu/latest/docs/configuration).\n\n### Polling Interval\nThe default polling interval has been updated to 10 minutes from 1 minute.\nThis affects how often the provider will run `tofu plan` on existing\n`Workspaces` to determine if there are any resources out of sync and whether\n`tofu apply` needs to be re-executed to recover the desired state.\nA 1-minute polling interval is often too short when the time required for\nrunning `tofu init`, `tofu plan` and `tofu apply` is taken\ninto account.  Workspaces with large numbers of resources can take longer\nthan 1 minute to run `tofu plan`.  Changes to the `Workspace` object\n`spec` will still be reconciled immediately.  The poll interval is\nconfigurable using `DeploymentRuntimeConfig`.\n\n## Known limitations:\n\n* You must either use remote state or ensure the provider container's `/tf`\n  directory is not lost. `provider-opentofu` __does not persist state__;\n  consider using the [Kubernetes](https://opentofu.org/docs/language/settings/backends/kubernetes/) remote state backend.\n* If the module takes longer than the value of `--timeout` (default is 20m) to apply the\n  underlying `tofu` process will be killed. You will potentially lose state\n  and leak resources.  The workspace lock will also likely be left in place and need to be manually removed\n  before the Workspace can be reconciled again.\n* The provider won't emit an event until _after_ it has successfully applied the\n  module, which can take a long time.\n* Setting `--max-reconcile-rate` to a value greater than 1 will potentially cause the provider\n  to use up to the same number of CPUs.  Add a resources section to the `DeploymentRuntimeConfig` to restrict\n  CPU usage as needed.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fupbound%2Fprovider-opentofu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fupbound%2Fprovider-opentofu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fupbound%2Fprovider-opentofu/lists"}