diff --git a/website/docs/cli/auth/index.mdx b/website/docs/cli/auth/index.mdx index 4583c71488..58d30b2c1a 100644 --- a/website/docs/cli/auth/index.mdx +++ b/website/docs/cli/auth/index.mdx @@ -9,7 +9,7 @@ description: >- > **Hands-on:** Try the [Authenticate the CLI with Terraform Cloud](https://learn.hashicorp.com/tutorials/terraform/cloud-login?in=terraform/cloud&utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS) tutorial. -[Terraform Cloud](/cloud) and +[Terraform Cloud](https://cloud.hashicorp.com/products/terraform) and [Terraform Enterprise](/enterprise) are platforms that perform Terraform runs to provision infrastructure, offering a collaboration-focused environment that makes it easier for teams to use Terraform together. (For diff --git a/website/docs/cli/cloud/migrating.mdx b/website/docs/cli/cloud/migrating.mdx index d9f15ae382..e30f155e44 100644 --- a/website/docs/cli/cloud/migrating.mdx +++ b/website/docs/cli/cloud/migrating.mdx @@ -17,7 +17,7 @@ When you run `terraform init` in the following scenarios, Terraform will ask you > **Hands On:** Try the [Migrate State to Terraform Cloud](https://learn.hashicorp.com/tutorials/terraform/cloud-migrate) tutorial. If the working directory already has state data available (using either local state or a [state -backend](/language/settings/backends)), Terraform asks your approval to migrate +backend](/language/settings/backends/configuration)), Terraform asks your approval to migrate that state to Terraform Cloud. You will need permission to manage workspaces in the destination Terraform Cloud organization. This process is interactive and self-documenting, and resembles moving between state backends. diff --git a/website/docs/cli/cloud/settings.mdx b/website/docs/cli/cloud/settings.mdx index 388d6fb9ef..0735402280 100644 --- a/website/docs/cli/cloud/settings.mdx +++ b/website/docs/cli/cloud/settings.mdx @@ -44,7 +44,7 @@ terraform { The `cloud` block also has some special restrictions: - A configuration can only provide one `cloud` block. -- A `cloud` block cannot be used with [state backends](/language/settings/backends). +- A `cloud` block cannot be used with [state backends](/language/settings/backends/configuration). A configuration can use one or the other, but not both. - A `cloud` block cannot refer to named values (like input variables, locals, or data source attributes). @@ -98,7 +98,7 @@ Use the following environment variables to configure the `cloud` block: - `TF_CLOUD_HOSTNAME` - The hostname of a Terraform Enterprise installation. Terraform reads this when `hostname` is omitted from the `cloud` block. If both are specified, the configuration takes precendence. -- `TF_WORKSPACE` - The name of a single Terraform Cloud workspace. Terraform reads this when `workspaces` is omitted from the `cloud` block. Terraform Cloud will not create a new workspace from this variable; the workspace must exist in the specified organization. You can set `TF_WORKSPACE` if the `cloud` block uses tags. However, the value of `TF_WORKSPACE` must be included in the set of tags. This variable also selects the workspace in your local environment. Refer to [TF_WORKSPACE](https://www.terraform.io/cli/config/environment-variables#tf_workspace) for details. +- `TF_WORKSPACE` - The name of a single Terraform Cloud workspace. Terraform reads this when `workspaces` is omitted from the `cloud` block. Terraform Cloud will not create a new workspace from this variable; the workspace must exist in the specified organization. You can set `TF_WORKSPACE` if the `cloud` block uses tags. However, the value of `TF_WORKSPACE` must be included in the set of tags. This variable also selects the workspace in your local environment. Refer to [TF_WORKSPACE](/cli/config/environment-variables#tf_workspace) for details. ## Excluding Files from Upload with .terraformignore diff --git a/website/docs/cli/commands/0.12upgrade.mdx b/website/docs/cli/commands/0.12upgrade.mdx index 73068ad71b..0a97ccb74c 100644 --- a/website/docs/cli/commands/0.12upgrade.mdx +++ b/website/docs/cli/commands/0.12upgrade.mdx @@ -11,7 +11,7 @@ The `terraform 0.12upgrade` command applies several automatic upgrade rules to help prepare a module that was written for Terraform v0.11 to be used with Terraform v0.12. --> **This command is available only in Terraform v0.12 releases.** For more information, see [the Terraform v0.12 upgrade guide](/language/upgrade-guides/0-12). +-> **This command is available only in Terraform v0.12 releases.** For more information, see [the Terraform v0.12 upgrade guide](/language/v1.1.x/upgrade-guides/0-12). ## Usage diff --git a/website/docs/cli/commands/0.13upgrade.mdx b/website/docs/cli/commands/0.13upgrade.mdx index 7322129aa9..c600bcb75a 100644 --- a/website/docs/cli/commands/0.13upgrade.mdx +++ b/website/docs/cli/commands/0.13upgrade.mdx @@ -11,7 +11,7 @@ The `terraform 0.13upgrade` command updates existing configuration to add an explicit `source` attribute for each provider used in a given module. The provider source settings are stored in a `required_providers` block. --> **This command is available only in Terraform v0.13 releases.** For more information, see [the Terraform v0.13 upgrade guide](/language/upgrade-guides/0-13). +-> **This command is available only in Terraform v0.13 releases.** For more information, see [the Terraform v0.13 upgrade guide](/language/v1.1.x/upgrade-guides/0-13). ## Usage diff --git a/website/docs/cli/commands/apply.mdx b/website/docs/cli/commands/apply.mdx index 2b71592b89..ad4ab10ff7 100644 --- a/website/docs/cli/commands/apply.mdx +++ b/website/docs/cli/commands/apply.mdx @@ -107,7 +107,7 @@ that directory as the root module instead of the current working directory. That usage was deprecated in Terraform v0.14 and removed in Terraform v0.15. If your workflow relies on overriding the root module directory, use -[the `-chdir` global option](/cli/commands/#switching-working-directory-with-chdir) +[the `-chdir` global option](/cli/commands#switching-working-directory-with-chdir) instead, which works across all commands and makes Terraform consistently look in the given directory for all files it would normally read or write in the current working directory. diff --git a/website/docs/cli/commands/init.mdx b/website/docs/cli/commands/init.mdx index 1c0d7df5c2..52119fd77e 100644 --- a/website/docs/cli/commands/init.mdx +++ b/website/docs/cli/commands/init.mdx @@ -192,7 +192,7 @@ that directory as the root module instead of the current working directory. That usage is still supported in Terraform v0.14, but is now deprecated and we plan to remove it in Terraform v0.15. If your workflow relies on overriding the root module directory, use -[the `-chdir` global option](/cli/commands/#switching-working-directory-with-chdir) +[the `-chdir` global option](/cli/commands#switching-working-directory-with-chdir) instead, which works across all commands and makes Terraform consistently look in the given directory for all files it would normally read or write in the current working directory. diff --git a/website/docs/cli/commands/plan.mdx b/website/docs/cli/commands/plan.mdx index d4f00c6991..77bddf3c40 100644 --- a/website/docs/cli/commands/plan.mdx +++ b/website/docs/cli/commands/plan.mdx @@ -350,7 +350,7 @@ module instead of the current working directory. That usage was deprecated in Terraform v0.14 and removed in Terraform v0.15. If your workflow relies on overriding the root module directory, use -[the `-chdir` global option](/cli/commands/#switching-working-directory-with-chdir) +[the `-chdir` global option](/cli/commands#switching-working-directory-with-chdir) instead, which works across all commands and makes Terraform consistently look in the given directory for all files it would normally read or write in the current working directory. diff --git a/website/docs/cli/commands/state/push.mdx b/website/docs/cli/commands/state/push.mdx index 8ce576c17c..2aa994527c 100644 --- a/website/docs/cli/commands/state/push.mdx +++ b/website/docs/cli/commands/state/push.mdx @@ -17,7 +17,7 @@ manual intervention is necessary with the remote state. Usage: `terraform state push [options] PATH` This command pushes the state specified by PATH to the currently -configured [backend](/language/settings/backends). +configured [backend](/language/settings/backends/configuration). If PATH is "-" then the state data to push is read from stdin. This data is loaded completely into memory and verified prior to being written to diff --git a/website/docs/cli/config/config-file.mdx b/website/docs/cli/config/config-file.mdx index 761baec6d7..c809adff60 100644 --- a/website/docs/cli/config/config-file.mdx +++ b/website/docs/cli/config/config-file.mdx @@ -76,7 +76,7 @@ The following settings can be set in the CLI configuration file: ## Credentials -[Terraform Cloud](/cloud) provides a number of remote network +[Terraform Cloud](https://cloud.hashicorp.com/products/terraform) provides a number of remote network services for use with Terraform, and [Terraform Enterprise](/enterprise) allows hosting those services inside your own infrastructure. For example, these systems offer both diff --git a/website/docs/cli/workspaces/index.mdx b/website/docs/cli/workspaces/index.mdx index a5b84fe65b..67eaf1554b 100644 --- a/website/docs/cli/workspaces/index.mdx +++ b/website/docs/cli/workspaces/index.mdx @@ -81,6 +81,6 @@ Workspaces are also meant to be a shared resource. They are not private, unless For local state, Terraform stores the workspace states in a directory called `terraform.tfstate.d`. This directory should be treated similarly to local-only `terraform.tfstate`. Some teams commit these files to version control, but we recommend using a remote backend instead when there are multiple collaborators. -For [remote state](/language/state/remote), the workspaces are stored directly in the configured [backend](/language/settings/backends). For example, if you use [Consul](/language/settings/backends/consul), the workspaces are stored by appending the workspace name to the state path. To ensure that workspace names are stored correctly and safely in all backends, the name must be valid to use in a URL path segment without escaping. +For [remote state](/language/state/remote), the workspaces are stored directly in the configured [backend](/language/settings/backends/configuration). For example, if you use [Consul](/language/settings/backends/consul), the workspaces are stored by appending the workspace name to the state path. To ensure that workspace names are stored correctly and safely in all backends, the name must be valid to use in a URL path segment without escaping. Terraform stores the current workspace name locally in the ignored `.terraform` directory. This allows multiple team members to work on different workspaces concurrently. Workspace names are also attached to associated remote workspaces in Terraform Cloud. For more details about workspace names in Terraform Cloud, refer to the [CLI Integration (recommended)](/cli/cloud/settings#arguments) and [remote backend](/language/settings/backends/remote#workspaces) and documentation. \ No newline at end of file diff --git a/website/docs/configuration/resources.mdx b/website/docs/configuration/resources.mdx index 7f9489afd6..75ed7ec98f 100644 --- a/website/docs/configuration/resources.mdx +++ b/website/docs/configuration/resources.mdx @@ -34,7 +34,7 @@ Each resource meta-argument has moved to its own page: - [`for_each`](/language/meta-arguments/for_each) - [`provider`](/language/meta-arguments/resource-provider) - [`lifecycle`](/language/meta-arguments/lifecycle) -- [Provisioners](/language/resources/provisioners) +- [Provisioners](/language/resources/provisioners/syntax)
@@ -88,6 +88,6 @@ This information has moved to ### Provisioners This information has moved to -[Provisioners](/language/resources/provisioners). +[Provisioners](/language/resources/provisioners/syntax). diff --git a/website/docs/internals/login-protocol.mdx b/website/docs/internals/login-protocol.mdx index e558a6eb43..c7267cd0c0 100644 --- a/website/docs/internals/login-protocol.mdx +++ b/website/docs/internals/login-protocol.mdx @@ -107,7 +107,7 @@ authorization errors once the token expires, after which the user can run -> **Note:** As a special case, Terraform can use a [Resource Owner Password Credentials Grant](https://tools.ietf.org/html/rfc6749#section-4.3) -only when interacting with `app.terraform.io` ([Terraform Cloud](/cloud)), +only when interacting with `app.terraform.io` ([Terraform Cloud](https://cloud.hashicorp.com/products/terraform)), under the recommendation in the OAuth specification to use this grant type only when the client and server are closely related. The `password` grant type is not supported for any other hostname and will be ignored. diff --git a/website/docs/intro/index.mdx b/website/docs/intro/index.mdx index b28b52e9e9..a3754ec1d9 100644 --- a/website/docs/intro/index.mdx +++ b/website/docs/intro/index.mdx @@ -48,7 +48,7 @@ Terraform configuration files are declarative, meaning that they describe the en ### Standardize configurations -Terraform supports reusable configuration components called [modules](/docs/language/modules) that define configurable collections of infrastructure, saving time and encouraging best practices. You can use publicly available modules from the Terraform Registry, or write your own. +Terraform supports reusable configuration components called [modules](/language/modules) that define configurable collections of infrastructure, saving time and encouraging best practices. You can use publicly available modules from the Terraform Registry, or write your own. ### Collaborate diff --git a/website/docs/intro/terraform-editions.mdx b/website/docs/intro/terraform-editions.mdx index 508c940218..9a77c5ad59 100644 --- a/website/docs/intro/terraform-editions.mdx +++ b/website/docs/intro/terraform-editions.mdx @@ -27,8 +27,8 @@ Terraform open source lets you: - Get Started tutorials for popular providers: [Amazon Web Services](https://learn.hashicorp.com/collections/terraform/aws-get-started), [Azure](https://learn.hashicorp.com/collections/terraform/azure-get-started), [Google Cloud Platform](https://learn.hashicorp.com/collections/terraform/gcp-get-started), [Oracle Cloud Infrastructure](https://learn.hashicorp.com/collections/terraform/oci-get-started), and [Docker](https://learn.hashicorp.com/collections/terraform/docker-get-started) - [What is Terraform?](/intro) -- [Configuration Language Documentation](/docs/language/index.html) -- [CLI Documentation](/docs/cli/index.html) +- [Configuration Language Documentation](/language) +- [CLI Documentation](/cli) ## Terraform Cloud @@ -48,9 +48,9 @@ Terraform Cloud lets you: ### Resources -- [Create a Terraform Cloud Account](https://app.terraform.io/signup/account) -- [Terraform Cloud Documentation](/docs/cloud/index.html) -- [Sentinel Documentation](/cloud-docs/sentinel) +- [Create a Terraform Cloud Account](https://app.terraform.io/public/signup/account) +- [Terraform Cloud Documentation](/cloud-docs) +- [Sentinel Documentation](/cloud-docs/policy-enforcement) - [Get Started - Terraform Cloud](https://learn.hashicorp.com/collections/terraform/cloud-get-started) tutorials show you how to manage infrastructure using Terraform Cloud's VCS integration ## Terraform Enterprise @@ -66,5 +66,5 @@ Terraform Enterprise lets you: ### Resources - [Terraform Pricing](https://www.hashicorp.com/products/terraform/pricing) -- [Terraform Enterprise Documentation](/docs/enterprise/index.html) +- [Terraform Enterprise Documentation](/enterprise) - [Recommended Enterprise Patterns](https://learn.hashicorp.com/collections/terraform/recommended-patterns) guides diff --git a/website/docs/intro/use-cases.mdx b/website/docs/intro/use-cases.mdx index 68086cabc7..bce26ed0f7 100644 --- a/website/docs/intro/use-cases.mdx +++ b/website/docs/intro/use-cases.mdx @@ -8,7 +8,7 @@ description: |- # Use Cases -[HashiCorp Terraform](/intro/index.html) is an infrastructure as code tool that lets you define infrastructure resources in human-readable configuration files that you can version, reuse, and share. You can then use a consistent workflow to safely and efficiently provision and manage your infrastructure throughout its lifecycle. +[HashiCorp Terraform](/intro) is an infrastructure as code tool that lets you define infrastructure resources in human-readable configuration files that you can version, reuse, and share. You can then use a consistent workflow to safely and efficiently provision and manage your infrastructure throughout its lifecycle. This page describes popular Terraform use cases and provides related resources that you can use to create Terraform configurations and workflows. @@ -50,7 +50,7 @@ Terraform can help you enforce policies on the types of resources teams can prov - Try the [Control Costs with Policies](https://learn.hashicorp.com/tutorials/terraform/cost-estimation) tutorial to estimate the cost of infrastructure changes and define policy to limit it. -- The [Sentinel documentation](/docs/cloud/sentinel/index.html) provides more in-depth information and a list of example policies that you can adapt for your use cases. +- The [Sentinel documentation](/cloud-docs/policy-enforcement) provides more in-depth information and a list of example policies that you can adapt for your use cases. ## PaaS Application Setup @@ -65,7 +65,7 @@ Try the [Deploy, Manage, and Scale an Application on Heroku](https://learn.hashi Terraform can interact with Software Defined Networks (SDNs) to automatically configure the network according to the needs of the applications running in it. This lets you move from a ticket-based workflow to an automated one, reducing deployment times. -For example, when a service registers with [HashiCorp Consul](https://www.consul.io/), [Consul-Terraform-Sync](https://www.consul.io/docs/nia) can automatically generate Terraform configuration to expose appropriate ports and adjust network settings for any SDN that has an associated Terraform provider. Network Infrastructure Automation (NIA) allows you to safely approve the changes that your applications require without having to manually translate tickets from developers into the changes you think their applications need. +For example, when a service registers with [HashiCorp Consul](https://www.consul.io/), [Consul-Terraform-Sync](https://developer.hashicorp.com/consul/docs/nia) can automatically generate Terraform configuration to expose appropriate ports and adjust network settings for any SDN that has an associated Terraform provider. Network Infrastructure Automation (NIA) allows you to safely approve the changes that your applications require without having to manually translate tickets from developers into the changes you think their applications need. ### Resources diff --git a/website/docs/language/functions/timestamp.mdx b/website/docs/language/functions/timestamp.mdx index 206e80f02b..d52878c8b1 100644 --- a/website/docs/language/functions/timestamp.mdx +++ b/website/docs/language/functions/timestamp.mdx @@ -20,7 +20,7 @@ Terraform run. We do not recommend using this function in resource attributes, but in rare cases it can be used in conjunction with [the `ignore_changes` lifecycle meta-argument](/language/meta-arguments/lifecycle#ignore_changes) to take the timestamp only on initial creation of the resource. For more stable -time handling, see the [Time Provider](https://registry.terraform.io/providers/hashicorp/time/). +time handling, see the [Time Provider](https://registry.terraform.io/providers/hashicorp/time). Due to the constantly changing return value, the result of this function cannot be predicted during Terraform's planning phase, and so the timestamp will be diff --git a/website/docs/language/index.mdx b/website/docs/language/index.mdx index 33b8535011..ca63d372b0 100644 --- a/website/docs/language/index.mdx +++ b/website/docs/language/index.mdx @@ -8,7 +8,7 @@ description: >- This is the documentation for Terraform's configuration language. It is relevant to users of [Terraform CLI](/cli), -[Terraform Cloud](/cloud), and +[Terraform Cloud](https://cloud.hashicorp.com/products/terraform), and [Terraform Enterprise](/enterprise). Terraform's language is its primary user interface. Configuration files you write in Terraform language tell Terraform what plugins to install, what infrastructure to create, diff --git a/website/docs/language/modules/index.mdx b/website/docs/language/modules/index.mdx index b33cae530e..3f84f48def 100644 --- a/website/docs/language/modules/index.mdx +++ b/website/docs/language/modules/index.mdx @@ -44,7 +44,7 @@ download them automatically if you specify the appropriate source and version in a module call block. Also, members of your organization might produce modules specifically crafted -for your own infrastructure needs. [Terraform Cloud](/cloud) and +for your own infrastructure needs. [Terraform Cloud](https://cloud.hashicorp.com/products/terraform) and [Terraform Enterprise](/enterprise) both include a private module registry for sharing modules internally within your organization. diff --git a/website/docs/language/settings/backends/gcs.mdx b/website/docs/language/settings/backends/gcs.mdx index 521c05f1c4..998828e22d 100644 --- a/website/docs/language/settings/backends/gcs.mdx +++ b/website/docs/language/settings/backends/gcs.mdx @@ -91,7 +91,7 @@ To get started, follow this guide: [Use customer-managed encryption keys](https: If you want to remove customer-managed keys from your backend configuration or change to a different customer-managed key, Terraform _can_ manage a state migration without manual intervention. This ability is because GCP stores customer-managed encryption keys and are accessible during the state migration process. However, these changes do not fully come into effect until the first write operation occurs on the state file after state migration occurs. In the first write operation after state migration, the file decrypts with the old key and then writes with the new encryption method. This method is equivalent to the [rewrite](https://cloud.google.com/storage/docs/gsutil/commands/rewrite) operation described in the customer-supplied encryption keys section. Because of the importance of the first write to state after state migration, you should not delete old KMS keys until any state file(s) encrypted with that key update. -Customer-managed keys do not need to be sent in requests to read files from GCS buckets because decryption occurs automatically within GCS. This process means that if you use the `terraform_remote_state` [data source](https://www.terraform.io/language/state/remote-state-data) to access KMS-encrypted state, you do not need to specify the KMS key in the data source's `config` object. +Customer-managed keys do not need to be sent in requests to read files from GCS buckets because decryption occurs automatically within GCS. This process means that if you use the `terraform_remote_state` [data source](/language/state/remote-state-data) to access KMS-encrypted state, you do not need to specify the KMS key in the data source's `config` object. ~> **Important:** To use customer-managed encryption keys, you need to create a key and give your project's GCS service agent permission to use it with the Cloud KMS CryptoKey Encrypter/Decrypter predefined role. diff --git a/website/docs/language/settings/backends/local.mdx b/website/docs/language/settings/backends/local.mdx index d2f5d18a0a..4aefa69930 100644 --- a/website/docs/language/settings/backends/local.mdx +++ b/website/docs/language/settings/backends/local.mdx @@ -89,7 +89,7 @@ backend type selected. We do not recommend using these options in new systems, even if you are running Terraform in automation. Instead, -[select a different backend which supports remote state](/language/settings/backends) and configure it +[select a different backend which supports remote state](/language/settings/backends/configuration) and configure it within your root module, which ensures that everyone working on your configuration will automatically retrieve and store state in the correct shared location without any special command line options. diff --git a/website/docs/language/settings/terraform-cloud.mdx b/website/docs/language/settings/terraform-cloud.mdx index 1f24e64465..184256d883 100644 --- a/website/docs/language/settings/terraform-cloud.mdx +++ b/website/docs/language/settings/terraform-cloud.mdx @@ -14,7 +14,7 @@ Terraform through version control or the API. ## Usage Example -To configure the Terraform Cloud CLI integration, add a nested `cloud` block within the `terraform` block. You cannot use the CLI integration and a [state backend](/language/settings/backends) in the same configuration. +To configure the Terraform Cloud CLI integration, add a nested `cloud` block within the `terraform` block. You cannot use the CLI integration and a [state backend](/language/settings/backends/configuration) in the same configuration. Refer to [Using Terraform Cloud](/cli/cloud) in the Terraform CLI documentation for full configuration details, migration instructions, and command line arguments. diff --git a/website/docs/language/state/locking.mdx b/website/docs/language/state/locking.mdx index 970c14f2fe..f81bcbd040 100644 --- a/website/docs/language/state/locking.mdx +++ b/website/docs/language/state/locking.mdx @@ -7,7 +7,7 @@ description: >- # State Locking -If supported by your [backend](/language/settings/backends), Terraform will lock your +If supported by your [backend](/language/settings/backends/configuration), Terraform will lock your state for all operations that could write state. This prevents others from acquiring the lock and potentially corrupting your state. @@ -21,7 +21,7 @@ a status message. If Terraform doesn't output a message, state locking is still occurring if your backend supports it. Not all backends support locking. The -[documentation for each backend](/language/settings/backends) +[documentation for each backend](/language/settings/backends/configuration) includes details on whether it supports locking or not. ## Force Unlock diff --git a/website/docs/language/state/remote-state-data.mdx b/website/docs/language/state/remote-state-data.mdx index 48ead8ea43..5bd7512641 100644 --- a/website/docs/language/state/remote-state-data.mdx +++ b/website/docs/language/state/remote-state-data.mdx @@ -7,7 +7,7 @@ description: >- # The `terraform_remote_state` Data Source -[backends]: /language/settings/backends +[backends]: /language/settings/backends/configuration The `terraform_remote_state` data source uses the latest state snapshot from a specified state backend to retrieve the root module output values from some other Terraform configuration. @@ -68,7 +68,7 @@ use of. For example: store or Consul service catalog can make that data also accessible via [Consul Template](https://github.com/hashicorp/consul-template) or the - [HashiCorp Nomad](https://www.nomadproject.io/docs/job-specification/template) + [HashiCorp Nomad](https://developer.hashicorp.com/nomad/docs/job-specification/template) `template` stanza. * If you use Kubernetes then you can [make Config Maps available to your Pods](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/). @@ -153,7 +153,7 @@ The following arguments are supported: The `config` object can use any arguments that would be valid in the equivalent `terraform { backend "