Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions .vale.ini
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,12 @@ Google.EmDash = NO
# produces noise without value.
Google.Latin = NO

# Soften two high-volume Google rules. The signal-to-noise ratio is low
# at the default warning level.
Google.Parens = suggestion
Google.WordList = warning
# Google.Parens flags every paren use as "use parentheses judiciously."
# Parens are a normal English punctuation device for clarification,
# examples, and disambiguation. The rule cannot distinguish stylistic
# intent from misuse, so even at suggestion level its signal-to-noise
# ratio is effectively zero. Disable.
Google.Parens = NO
Comment on lines +51 to +56

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 [CRF-1] PR description says "Two commits, in this order so each is independently valid" and lists exactly two. The branch has five:

# Commit Described?
1 Fix HashiCorp casing in prose and sidebar Yes
2 Add Coder.BrandNames Vale rule + style guide section Yes
3 Scrub README planned-rules list No
4 Semantic line breaks + copyediting (63 ins / 89 del across 7 files) No
5 Disable Google.Parens in .vale.ini (this block) No

Commit 5 changes Google.Parens from suggestion to NO, dropping ~1800 suggestion-level findings from make lint/prose. The commit message is honest and the rationale is sound, but this is an independent Vale severity-policy decision invisible to reviewers who scope from the description. The verification numbers in the PR description ("7681 suggestions") may reflect the pre-Parens-disable state.

Update the PR description to account for all five commits, or split the Google.Parens disable into its own PR. (Mafu-san P2, Hisoka P3, Luffy P3, Kite P3)

🤖

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-10] The PR title scope docs does not contain every changed file. .vale.ini is at the repo root, outside docs/. AGENTS.md: "When you use a scope, it must be a real filesystem path containing every changed file." The two CI title-check failures (82815991380, 82816044244) may be flagging this mismatch. Either drop the scope (feat: add Coder.BrandNames...) or use a scope that covers all paths. (Kite)

🤖


# Google.Spacing flags fully-qualified Go type names like
# `codersdk.WorkspaceAgent` as "should have one space." It produces ~4,500
Expand All @@ -64,6 +66,11 @@ Google.WordList = warning
# `error`.
Google.Spacing = NO

# Google.WordList is the canonical Google word-substitution table. Keep
# at warning (the default for the Google package) so non-canonical word
# choices surface as CI annotations.
Google.WordList = warning

# --- write-good curation ---------------------------------------------------
# Passive voice is contextually correct often enough that flagging every
# instance teaches nothing. E-Prime forbids forms of "to be" entirely,
Expand Down
89 changes: 47 additions & 42 deletions docs/.style/style-guide.md
Original file line number Diff line number Diff line change
@@ -1,103 +1,108 @@
# Coder documentation style guide

This is the canonical style guide for the Coder documentation. It is the
source of truth that the Vale rules in `docs/.style/styles/Coder/` enforce.
This is the canonical style guide for the Coder documentation.
It's the source of truth that the Vale rules in `docs/.style/styles/Coder/` enforce.

Status: scaffold. Sections below are populated by follow-up PRs; this
page starts as a table of contents and grows as those PRs land.
Status: scaffold.
Follow-up PRs populate the sections below.
This page starts as a table of contents and grows as those PRs land.

## How to use this guide

This page is a scaffold while follow-up PRs land. Sections marked "To be
filled in" are placeholders. For anything not yet covered, see the
public summary at
[`docs/about/contributing/documentation.md`](../about/contributing/documentation.md).
This page is a scaffold while follow-up PRs land.
Sections marked "Coming in follow-up PRs" are placeholders.
For anything not yet covered, see the public summary at [`docs/about/contributing/documentation.md`](../about/contributing/documentation.md).

- **Contributors**: read the section that matches what you are writing.
Each rule notes the Vale rule ID, if any, so you can reproduce the
warning locally.
- **Reviewers**: cite the section in a review comment. Reviews are easier
when the guidance is in one place.
- **AI agents**: read this page in full before editing anything under
`docs/`. The Coder Agents and Claude Code guides
([`AGENTS.md`](../../AGENTS.md),
[`.claude/docs/DOCS_STYLE_GUIDE.md`](../../.claude/docs/DOCS_STYLE_GUIDE.md))
link here.
Each rule notes the Vale rule ID, if any, so you can reproduce the warning locally.
- **Reviewers**: cite the section in a review comment.
Reviews are easier when the guidance is in one place.
- **AI agents**: read this page in full before editing anything under `docs/`.
The Coder Agents and Claude Code guides ([`AGENTS.md`](../../AGENTS.md), [`.claude/docs/DOCS_STYLE_GUIDE.md`](../../.claude/docs/DOCS_STYLE_GUIDE.md)) link here.

## Voice and tone

To be filled in by follow-up PRs. Planned coverage:
Coming in follow-up PRs:

- Active voice
- Second person
- Plural nouns and pronouns where number is uncertain
- Product voice (`stop` over `kill`, `turn off` over `disable` in
user-facing copy)
- Limiting "we"
- Product voice (`stop` over `kill`, `turn off` over `disable` in user-facing copy)
- Limit `we`

## Word choice

To be filled in by follow-up PRs. Planned coverage:
Coming in follow-up PRs:

- Inclusive-language substitutions
- HashiCorp casing
- Dev Container terminology
- "Setup" vs "set up" and Quickstart casing
- "Next steps" vs "Learn more"
- Weasel words

### Brand names

Use each brand's canonical casing in prose.
URLs and code references (Terraform provider source addresses, GitHub paths) keep the lowercase form their owner uses.
Vale's `substitution` rule skips inline code and links by default, so those aren't affected.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 [CRF-3] This says the substitution rule "skips inline code and links." Vale's substitution rules skip link URLs but check link display text. The PR's own cleanup confirms this: [Hashicorp Vault](...) in link display text was flagged and fixed.

The BrandNames.yml comment (line 3) uses the correct wording: "it skips fenced code blocks, inline code, and URLs." The style guide should match. Replace "links" with "link URLs" or adopt the BrandNames.yml phrasing. (Razor)

🤖


| Wrong | Correct | Notes |
|-------------|-------------|-----------------------------------|
| `Hashicorp` | `HashiCorp` | Mixed case: capital H, capital C. |

More brands (GitHub, OpenTofu, Kubernetes, Terraform, JetBrains, VS Code) extend this table as they land in follow-up PRs.

Enforced by `Coder.BrandNames` (level `error`).
To add a brand: append a swap to `docs/.style/styles/Coder/BrandNames.yml`,
run `make lint/prose` to catch existing-content violations,
fix them, then commit.

## Capitalization and punctuation

To be filled in by follow-up PRs. Planned coverage:
Coming in follow-up PRs:

- Sentence case in titles and headings
- General capitalization policy
- Em-dash and en-dash ban (use comma, semicolon, or period)

## Formatting

To be filled in by follow-up PRs. Planned coverage:
Coming in follow-up PRs:

- Bold for UI elements
- Italics for parameter names and version variables
- Code font for user input, command-line utility names, filenames,
environment variables, HTTP verbs and status codes, placeholder
variables
- Code font for user input, command-line utility names, filenames, environment variables, HTTP verbs and status codes, placeholder variables
- Code blocks with explicit language fences

## Vale enforcement

The repo-root `.vale.ini` configures Vale to read styles from
`docs/.style/styles/`. The starter configuration combines:
The repo-root `.vale.ini` configures Vale to read styles from `docs/.style/styles/`.
The starter configuration combines:

- Google's developer-docs base style
- A curated subset of `alex` (inclusive-language)
- A curated subset of `write-good` (wordiness)
- Coder-specific custom rules in `docs/.style/styles/Coder/`

The rationale for the cherry-picked base styles and the severity
policy lives in `.vale.ini`'s inline comments. Run `make lint/prose`
to reproduce the baseline locally.
The rationale for the cherry-picked base styles and the severity policy lives in `.vale.ini`'s inline comments.
Run `make lint/prose` to reproduce the baseline locally.

## Editor setup

To be filled in by a follow-up PR. Will cover VS Code, Cursor,
JetBrains, and Neovim.
A follow-up PR adds coverage for VS Code, Cursor, JetBrains, and Neovim.

## Relationship to `docs/about/contributing/documentation.md`

A public-facing prose summary lives today at
[`docs/about/contributing/documentation.md`](../about/contributing/documentation.md).
A follow-up PR will redirect that page to this guide; until then,
follow the public summary for anything the scaffolded sections above do
not yet cover. New prose rules land here; the public page is frozen
pending the redirect.
A public-facing prose summary lives today at [`docs/about/contributing/documentation.md`](../about/contributing/documentation.md).
A follow-up PR redirects that page to this guide.
Until then, follow the public summary for anything the scaffolded sections in this guide don't yet cover.
New prose rules land here; the public page is frozen pending the redirect.

Check warning on line 99 in docs/.style/style-guide.md

View workflow job for this annotation

GitHub Actions / lint-docs

In general, use active voice instead of passive voice ('is frozen').

Check warning on line 99 in docs/.style/style-guide.md

View workflow job for this annotation

GitHub Actions / lint-docs

Use semicolons judiciously.

## Third-party references

When this guide does not cover something, consult:
When this guide doesn't cover something, consult:

| Type of guidance | Reference |

Check warning on line 105 in docs/.style/style-guide.md

View workflow job for this annotation

GitHub Actions / lint-docs

'Type of' is too wordy.
|---------------------|-----------------------------------------------------------------------------------------|
| Spelling | [Merriam-Webster](https://www.merriam-webster.com/) |
| Style, nontechnical | [The Chicago Manual of Style](https://www.chicagomanualofstyle.org/home.html) |
Expand Down
28 changes: 28 additions & 0 deletions docs/.style/styles/Coder/BrandNames.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Coder.BrandNames - enforce canonical brand-name casing in prose.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 [CRF-6] The PR description's verification section says the rule "flags the 7 instances the cleanup commit fixes." Vale scopes to [*.md] only (.vale.ini line 47); it can only flag the 5 Markdown instances. The 2 manifest.json fixes are manual edits outside Vale's scope. The claim conflates Vale-flagged instances with manually-fixed entries. The correct statement is: Vale flags 5 instances; 2 additional instances in manifest.json are fixed by hand. (Mafu-san)

🤖

#
# Vale's substitution rule applies in prose only; it skips fenced code
# blocks, inline code, and URLs by default. That means `hashicorp/kubernetes`
# (Terraform provider source) and `developer.hashicorp.com` (URL) stay
# untouched. The rule fires on body text and headings where the wrong
# casing appears as a normal word.
#
# Level: error. Each swap targets a brand whose owner publishes a
# canonical casing; "Hashicorp Vault" instead of "HashiCorp Vault" is
# objectively wrong, not a judgment call. The existing-content violation
# count is zero (cleanup landed in the previous commit), so this rule

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 [CRF-4] "cleanup landed in the previous commit" is a temporal reference that dissolves after merge. After a squash merge, "the previous commit" doesn't exist. After a rebase merge, the SHA changes. The factual claim (violation count is zero) stands on its own. Drop the parenthetical:

# count is zero, so this rule can ship at error from day one.

(Leorio)

🤖

# can ship at error from day one.
#
# Adding a brand: append a key/value to the swap table below and audit
# the docs corpus for the wrong-casing variant. Keep the message template
# unchanged; the `%s` token interpolates the matched (wrong) text.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 [CRF-2] The comment says "the %s token interpolates the matched (wrong) text" (singular). The message template has two %s tokens with different semantics: the first interpolates the correct (replacement) form, the second interpolates the matched (wrong) form. A contributor adapting this template or debugging a message that reads backward gets a wrong mental model.

Suggestion:

# unchanged; the first %s interpolates the correct (replacement) text
# and the second interpolates the matched (wrong) text.

(Leorio)

🤖

Comment on lines +1 to +17

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 [CRF-7] The header comment is 17 lines for 11 lines of config. Roughly half restates identifiers or duplicates content from style-guide.md:

  • Line 1 (Coder.BrandNames - enforce canonical brand-name casing) restates the filename and extends: substitution.
  • Lines 3-7 (substitution scope) duplicate style-guide.md:47.
  • Lines 15-17 (how to add a brand) duplicate style-guide.md:56-58.

The trap (false-positive scope) and why-not-what (error level) carry their weight. Trimmed draft that keeps both:

# substitution rules skip code blocks, inline code, and URLs, so
# provider sources (hashicorp/kubernetes) and URLs are unaffected.
#
# Error from day one: brand casing is objectively right or wrong,
# and existing-content violations are zero.
#
# Adding a brand: append to swap, audit docs for violations.

(Gon)

🤖

extends: substitution
message: "Use '%s' instead of '%s' (brand-name casing)."
link: https://github.com/coder/coder/blob/main/docs/.style/style-guide.md#brand-names
level: error

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note [CRF-12] Worth knowing: make lint/prose uses --no-exit (Makefile:854), so Coder.BrandNames at error level surfaces as a CI annotation but does not fail the build or block merge. The enforcement depends on human reviewers noticing the annotation. This is a system-level constraint from the 391 pre-existing errors in upstream Google rules, not a flaw of this PR. (Pariston)

🤖

ignorecase: false
nonword: false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P4 [CRF-8] No regression fixture for the rule. If someone later breaks the swap YAML or removes an entry, there's no automated check that the rule still fires on known-bad input. The "test" is the absence of violations in the corpus, which is indistinguishable from a broken rule that fires on nothing. Not this PR's debt (no Vale rule test infrastructure exists in the repo), but worth noting as the Coder/ style directory grows. (Bisky)

🤖

action:
name: replace
swap:
Hashicorp: HashiCorp

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 [CRF-5] The swap table catches Hashicorp and HASHICORP but omits hashicorp (all lowercase). The PR adds HASHICORP defensively despite zero corpus occurrences, but omits hashicorp citing 49 URL/code instances. However, this rule extends: substitution, and Vale's substitution scope already skips fenced code blocks, inline code, and URLs by default (as the comment on lines 3-7 documents). Adding hashicorp: HashiCorp would catch the one case the current table misses (lowercase in prose, which is always wrong for a proper noun) with zero false-positive risk.

The stated fallback (Vale.Spelling, DOCS-187) doesn't exist yet. Until it ships, a contributor who writes "hashicorp" in body text gets no lint signal.

swap:
  hashicorp: HashiCorp
  Hashicorp: HashiCorp
  HASHICORP: HashiCorp

(Zoro P3, Hisoka Note)

🤖

HASHICORP: HashiCorp
34 changes: 15 additions & 19 deletions docs/.style/styles/Coder/README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# Coder custom Vale rules

Check warning on line 1 in docs/.style/styles/Coder/README.md

View workflow job for this annotation

GitHub Actions / lint-docs

'Coder custom Vale rules' should use sentence-style capitalization.

Custom Vale rules specific to Coder live here. Each rule is a YAML file
that Vale loads through the `BasedOnStyles = Coder` setting in the
repo-root `.vale.ini`.
Custom Vale rules specific to Coder live here.
Each rule is a YAML file that Vale loads through the `BasedOnStyles = Coder` setting in the repo-root `.vale.ini`.

This directory is intentionally empty for now. Follow-up PRs add rules
incrementally. Planned starter rules:
Active rules ship as YAML files in this directory.
See the matching sections in `docs/.style/style-guide.md` for the user-facing policy each rule enforces.
Follow-up PRs add rules incrementally.
Planned coverage:

- Dev Container terminology
- HashiCorp casing
- Limit "we"
- Limit `we`
- Setup vs set up, Quickstart casing
- Next steps vs Learn more
- Vale substitution rule scaffold

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-9] "Vale substitution rule scaffold" is stale or ambiguous. BrandNames.yml shipped in this PR as a substitution rule. A contributor reading this planned-coverage list would reasonably wonder what scaffold work remains. Remove the bullet or rename it to distinguish it from the rule that just shipped. (Gon)

🤖

Expand All @@ -20,19 +20,15 @@

## Authoring a new rule

1. Write a YAML file under this directory. Name it after the rule's
intent, for example `InclusiveLanguage.yml` or `ProductVoice.yml`.
2. Each rule's `message:` should link to the matching section in
`docs/.style/style-guide.md`, ideally with a deep-link anchor, so a
contributor reading a Vale warning can jump straight to the guidance.
3. Land at `level: warning` first. Promote to `level: error` only after
both conditions hold:
- The rule is objectively correct (typo, brand-name casing, banned
substitution).
1. Write a YAML file under this directory.
Name it after the rule's intent, for example `InclusiveLanguage.yml` or `ProductVoice.yml`.
2. Each rule's `message:` should link to the matching section in `docs/.style/style-guide.md`, ideally with a deep-link anchor, so a contributor reading a Vale warning can jump straight to the guidance.
3. Land at `level: warning` first.
Promote to `level: error` only after both conditions hold:
- The rule is objectively correct (typo, brand-name casing, banned substitution).
- The existing-content violation count for the rule reaches zero.
4. A follow-up PR will add a parity CI check that verifies every rule
here has a matching section in `style-guide.md`. Add the section in
the same PR as the rule.
4. A follow-up PR adds a parity CI check that verifies every rule here has a matching section in `style-guide.md`.
Add the section in the same PR as the rule.

## Reference

Expand Down
3 changes: 1 addition & 2 deletions docs/admin/integrations/multiple-kube-clusters.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Additional clusters

Check warning on line 1 in docs/admin/integrations/multiple-kube-clusters.md

View workflow job for this annotation

GitHub Actions / lint-docs

'Additional' is too wordy.

With Coder, you can deploy workspaces in additional Kubernetes clusters using

Check warning on line 3 in docs/admin/integrations/multiple-kube-clusters.md

View workflow job for this annotation

GitHub Actions / lint-docs

'additional' is too wordy.
different
Expand All @@ -10,7 +10,7 @@
## Option 1) Kubernetes contexts and kubeconfig

First, create a kubeconfig file with
[multiple contexts](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/).

Check warning on line 13 in docs/admin/integrations/multiple-kube-clusters.md

View workflow job for this annotation

GitHub Actions / lint-docs

'multiple' is too wordy.

```shell
kubectl config get-contexts
Expand All @@ -24,14 +24,14 @@

If you deployed Coder on Kubernetes, you can attach a kubeconfig as a secret.

This assumes Coder is deployed on the `coder` namespace and your kubeconfig file

Check warning on line 27 in docs/admin/integrations/multiple-kube-clusters.md

View workflow job for this annotation

GitHub Actions / lint-docs

In general, use active voice instead of passive voice ('is deployed').
is in ~/.kube/config.

```shell
kubectl create secret generic kubeconfig-secret -n coder --from-file=~/.kube/config
```

Modify your helm values to mount the secret:

Check warning on line 34 in docs/admin/integrations/multiple-kube-clusters.md

View workflow job for this annotation

GitHub Actions / lint-docs

'Modify' is too wordy.

```yaml
coder:
Expand All @@ -49,7 +49,7 @@
[Upgrade Coder](../../install/kubernetes.md#upgrading-coder-via-helm) with these
new values.

### VM control plane

Check warning on line 52 in docs/admin/integrations/multiple-kube-clusters.md

View workflow job for this annotation

GitHub Actions / lint-docs

'VM control plane' should use sentence-style capitalization.

If you deployed Coder on a VM, copy the kubeconfig file to
`/home/coder/.kube/config`.
Expand Down Expand Up @@ -94,8 +94,7 @@
tokens. Coder can store these secrets on your behalf with
[managed Terraform variables](../templates/extending-templates/variables.md).

Alternatively, these could also be fetched from Kubernetes secrets or even
[Hashicorp Vault](https://registry.terraform.io/providers/hashicorp/vault/latest/docs/data-sources/generic_secret).
Alternatively, these could also be fetched from Kubernetes secrets or even [HashiCorp Vault](https://registry.terraform.io/providers/hashicorp/vault/latest/docs/data-sources/generic_secret).

This guide assumes you have a `coder-workspaces` namespace on your remote
cluster. Change the namespace accordingly.
Expand Down
3 changes: 1 addition & 2 deletions docs/admin/integrations/opentofu.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ Coder deployments support any custom Terraform binary, including
[OpenTofu](https://opentofu.org/docs/) - an open source alternative to
Terraform.

You can read more about OpenTofu and Hashicorp's licensing in our
[blog post](https://coder.com/blog/hashicorp-license) on the Terraform licensing changes.
You can read more about OpenTofu and HashiCorp's licensing in our [blog post](https://coder.com/blog/hashicorp-license) on the Terraform licensing changes.

## Using a custom Terraform binary

Expand Down
10 changes: 3 additions & 7 deletions docs/admin/templates/extending-templates/workspace-tags.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,9 @@ Passing template tags in from other data sources or resources is not permitted.

### HCL syntax

When importing the template version with `coder_workspace_tags`, the Coder
provisioner server extracts raw partial queries for each workspace tag and
stores them in the database. During workspace build time, the Coder server uses
the [Hashicorp HCL library](https://github.com/hashicorp/hcl) to evaluate these
raw queries on-the-fly without processing the entire Terraform template. This
evaluation is simpler but also limited in terms of available functions,
variables, and references to other resources.
When importing the template version with `coder_workspace_tags`, the Coder provisioner server extracts raw partial queries for each workspace tag and stores them in the database.
During workspace build time, the Coder server uses the [HashiCorp HCL library](https://github.com/hashicorp/hcl) to evaluate these raw queries on-the-fly without processing the entire Terraform template.
This evaluation is simpler but also limited in terms of available functions, variables, and references to other resources.

#### Supported syntax

Expand Down
10 changes: 3 additions & 7 deletions docs/admin/templates/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,9 @@ underlying infrastructure that all Coder workspaces run on.

## 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](../../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.
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](../../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.

## Starter templates

Expand Down
4 changes: 2 additions & 2 deletions docs/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -808,8 +808,8 @@
"path": "./admin/integrations/dx-data-cloud.md"
},
{
"title": "Hashicorp Vault",
"description": "Integrate Coder with Hashicorp Vault",
"title": "HashiCorp Vault",
"description": "Integrate Coder with HashiCorp Vault",
"path": "./admin/integrations/vault.md"
},
{
Expand Down
4 changes: 2 additions & 2 deletions docs/tutorials/template-from-scratch.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ server essentially runs a `terraform apply` every time a workspace is created,
started, or stopped.

> [!TIP]
> Haven't written Terraform before? Check out Hashicorp's
> [Getting Started Guides](https://developer.hashicorp.com/terraform/tutorials).
> Haven't written Terraform before?
> Check out HashiCorp's [Getting Started Guides](https://developer.hashicorp.com/terraform/tutorials).

Here's a simplified diagram that shows the main parts of the template we'll
create:
Expand Down
Loading