
# Template

Templates are written in
[Terraform](https://developer.hashicorp.com/terraform/intro) and define the
underlying infrastructure that all Coder workspaces run on.

The [template builder](https://coder.com/docs/admin/templates/creating-templates.md#template-builder) is
the recommended way to create templates. It guides you through selecting base
infrastructure, adding modules, and configuring your template without writing
Terraform.

## Learn the concepts

While templates are written in standard Terraform, it's important to learn the Coder-specific concepts behind templates.
The best way to learn the concepts is by [creating a basic template from scratch](https://coder.com/docs/tutorials/template-from-scratch.md).
If you are unfamiliar with Terraform, see [HashiCorp's Tutorials](https://developer.hashicorp.com/terraform/tutorials) for common cloud providers.

## Create a template

The fastest way to get started is with the
[template builder](https://coder.com/docs/admin/templates/creating-templates.md#template-builder), which
composes a working template from a base infrastructure template and optional
registry modules. Starter templates for popular platforms (AWS, Kubernetes,
Docker, and others) are available as base templates in the builder, or through
the [CLI](https://coder.com/docs/admin/templates/creating-templates.md#cli).

## Extending templates

It's often necessary to extend the template to make it generally useful to end
users. Common modifications are:

- Your image(s) (e.g. a Docker image with languages and tools installed). Docs:
  [Image management](https://coder.com/docs/admin/templates/managing-templates/image-management.md).
- Additional parameters (e.g. disk size, instance type, or region). Docs:
  [Template parameters](https://coder.com/docs/admin/templates/extending-templates/parameters.md).
- Additional IDEs (e.g. JetBrains) or features (e.g. dotfiles, RDP). Docs:
  [Adding IDEs and features](https://coder.com/docs/admin/templates/extending-templates.md).

Learn more about the various ways you can
[extend your templates](https://coder.com/docs/admin/templates/extending-templates.md).

## Best Practices

We recommend starting with a universal template that can be used for basic
tasks. As your Coder deployment grows, you can create more templates to meet the
needs of different teams.

- [Image management](https://coder.com/docs/admin/templates/managing-templates/image-management.md): Learn how to
  create and publish images for use within Coder workspaces & templates.
- [Dev Containers integration](https://coder.com/docs/admin/integrations/devcontainers/integration.md): Enable
  native dev containers support using `@devcontainers/cli` and Docker.
- [Envbuilder](https://coder.com/docs/admin/integrations/devcontainers/envbuilder.md): Alternative approach
  for environments without Docker access.
- [Template hardening](https://coder.com/docs/admin/templates/extending-templates/resource-persistence.md#-bulletproofing):
  Configure your template to prevent certain resources from being destroyed
  (e.g. user disks).
- [Manage templates with Ci/Cd pipelines](https://coder.com/docs/admin/templates/managing-templates/change-management.md):
  Learn how to source control your templates and use GitOps to ensure template
  changes are reviewed and tested.
- [Permissions and Policies](https://coder.com/docs/admin/templates/template-permissions.md): Control who may access
  and modify your template.
- [External Workspaces](https://coder.com/docs/admin/templates/managing-templates/external-workspaces.md): Learn how to connect your existing infrastructure to Coder workspaces.

<children></children>
