mirror of
https://github.com/coder/coder.git
synced 2026-11-01 12:53:26 +08:00
## Problem
Generated reference docs (`docs/reference/cli/*`,
`docs/reference/api/*`) contained raw placeholder and JSON syntax that
came straight from Go CLI help strings and swagger annotations. HTML
renderers treat the angle-bracket tokens (`<team-slug>`, `<uuid>`,
`<KEY>`, etc.) as unknown tags and drop them, so readers see
broken/half-missing text today. The same strings also break MDX parsing.
## Fix
Wrap the placeholder/JSON syntax in backticks **at the source** (Go help
strings and swagger annotation comments), then `make gen`. Rendered docs
now show the placeholders as inline code instead of dropping them.
### Source changes
| File | Placeholder wrapped | Surfaces in |
|------|--------------------|-------------|
| `codersdk/deployment.go` | `` `<organization-name>/<team-slug>` `` |
`cli/server.md`, `coder --help`, settings UI |
| `codersdk/deployment.go` | `` `CODER_AI_GATEWAY_PROVIDER_<N>_*` ``, ``
`CODER_AI_GATEWAY_PROVIDER_<N>_<KEY>` `` | `api/schemas.md` |
| `cli/tokens.go` | `` `<type>:<uuid>` `` | `cli/tokens_create.md`,
`coder --help` |
| `coderd/aitasks.go` | `` `owner:<…>` ``, `` `organization:<…>` ``, ``
`status:<status>` `` | `api/tasks.md` |
| `coderd/exp_chats.go` | `` `pr_status:<…>` `` and sibling filter
tokens | `api/chats.md` |
| `coderd/provisionerdaemons.go`, `coderd/provisionerjobs.go` | ``
`{'tag1':'value1','tag2':'value2'}` `` | `api/organizations.md`,
`api/provisioning.md` |
Everything else in the diff (`coderd/apidoc/*`, `docs/reference/**`,
`*.golden`, `site/src/api/typesGenerated.ts`) is `make gen` output.
## Reviewer notes (the "considered pass" from the ticket)
- **Product-visible:** this changes `coder server --help` and `coder
tokens create --help` output, and the `server-config.yaml` reference
comment. Backticks in terminal help are literal but read fine as
placeholder markers.
- **Settings UI:** the `deployment.go` `Description` also renders in the
deployment settings page. If that field is not Markdown-rendered,
literal backticks will show there. Happy to drop the `deployment.go`
change if you'd rather keep the UI text clean and fix `server.md`
another way.
- **Out of scope here:** `docs/reference/cli/agent-firewall.md`
(`<host>`/`<glob>`) is generated from the external
`github.com/coder/boundary` module, not this repo. It needs an upstream
fix + module bump; not included in this PR.
<details>
<summary>Implementation notes / decision log</summary>
- Scope taken from DOCS-551: source-level backtick pass for generated
reference docs only. Hand-written Markdown fixes are tracked separately
(companion ticket).
- Swagger `@Param` descriptions are Go comments, so the existing `\|`
pipe-escaping in the chats `q` filter is preserved inside the new
backticks (still required for the Markdown table cell to render `|`).
- Verified after `make gen`: generated docs render placeholders as code
spans, table pipes intact; `gofmt` clean; changed Go packages build; no
emdash/endash introduced.
- Deliberately left the `AIProviderConfig` type-level doc comment
untouched because it does not surface in any generated doc (kept the
diff to doc-feeding comments).
</details>
Linear: DOCS-551
---
_Opened by Coder Agents on behalf of @nickvigilante._
---
## Evidence: placeholders dropped on the live docs site
Verified **2026-07-14** against the live site (`coder.com/docs`, i.e.
`main`, pre-merge) by loading each affected page in headless Chrome and
reading the post-hydration DOM (confirmed identical in the raw page
payload). Each simple `<token>` placeholder is parsed as an **empty
custom HTML element**, so the browser renders nothing for it and the
placeholder text disappears from the page.
### What readers see today (before this PR)
| Page (live) | Source Markdown | Rendered on the live site |
|-------------|-----------------|---------------------------|
| [`cli/server`](https://coder.com/docs/reference/cli/server) — OAuth2
GitHub Allowed Teams | `Structured as: <organization-name>/<team-slug>.`
| `Structured as: /.` |
|
[`cli/tokens_create`](https://coder.com/docs/reference/cli/tokens_create)
— `--allow` | `Repeatable allow-list entry (<type>:<uuid>, e.g.
workspace:1234-...).` | `Repeatable allow-list entry (:, e.g.
workspace:1234-...).` |
| [`api/tasks`](https://coder.com/docs/reference/api/tasks) — `q` | `...
status:<status>` | `... status:` (nothing after the colon) |
| [`api/schemas`](https://coder.com/docs/reference/api/schemas) —
AIBridgeConfig (`anthropic`/`bedrock`/`openai`) |
`CODER_AI_GATEWAY_PROVIDER_<N>_*` | `CODER_AI_GATEWAY_PROVIDER__*` |
| [`api/schemas`](https://coder.com/docs/reference/api/schemas) —
AIBridgeConfig (`providers`) | `CODER_AI_GATEWAY_PROVIDER_<N>_<KEY>` |
`CODER_AI_GATEWAY_PROVIDER__` |
[`api/chats`](https://coder.com/docs/reference/api/chats) (`q`) drops
five tokens the same way — `title:<substring>`, `diff_url:<url>`,
`pr:<number>`, `pr_title:<text>`, and the trailing `title:<value>`. The
live parameter description reads (note the dangling `title:`,
`diff_url:`, `pr:`, `pr_title:`):
```text
Search query. Supports title: (case-insensitive, quote multi-word values), archived:bool, has_unread:bool, pr_status:<draft|open|merged|closed> as repeated or comma-separated values, source:<created_by_me|shared_with_me>, diff_url: (quote values containing colons), pr: (exact PR number match), repo:<owner/repo> (case-insensitive substring match against git remote origin or URL), pr_title: (case-insensitive PR title substring). Bare terms are not supported; use title: for title filtering.
```
<details>
<summary>Raw rendered DOM from the live site (headless Chrome,
post-hydration)</summary>
```html
<!-- reference/cli/server -->
Structured as: <organization-name>/<team-slug>.</team-slug></organization-name>
<!-- reference/cli/tokens_create -->
Repeatable allow-list entry (<type>:<uuid>, e.g. workspace:1234-...).</uuid></type>
<!-- reference/api/tasks : only status:<status> drops; the /-containing tokens are escaped and survive -->
Search query for filtering tasks. Supports: owner:<username/uuid/me>, organization:<org-name/uuid>, status:<status></status>
<!-- reference/api/schemas : anthropic / bedrock / openai rows -->
Deprecated: Use Providers with indexed CODER_AI_GATEWAY_PROVIDER_<n>_* env vars instead.</n>
<!-- reference/api/schemas : providers row -->
Providers holds provider instances populated from CODER_AI_GATEWAY_PROVIDER_<n>_<key> env vars and/or the deprecated LegacyOpenAI/LegacyAnthropic/LegacyBedrock fields above.</key></n>
```
The parser auto-inserts closing tags
(`</team-slug></organization-name>`) and lowercases the tag name (`<N>`
becomes `<n>`), leaving `__` where `<N>_` used to be. Every wrapped
placeholder renders correctly as inline code on the [docs preview for
this
branch](https://coder.com/docs/@vigilante%2Fdocs-551-backtick-placeholder-syntax-in-generated-reference-docs-cli/reference/cli/server).
</details>
### Accuracy note — cases that do *not* drop on live
These render fine today, so they are **not** evidence of dropping (the
PR still wraps them for consistency / MDX-safety):
-
[`api/organizations`](https://coder.com/docs/reference/api/organizations)
and
[`api/provisioning`](https://coder.com/docs/reference/api/provisioning):
`{'tag1':'value1','tag2':'value2'}` renders verbatim — curly braces are
not an HTML tag.
- Tokens containing `/` or `|` are escaped by the renderer and stay
visible (as literal `<...>`): `<username/uuid/me>`, `<org-name/uuid>`,
`<owner/repo>`, `<draft|open|merged|closed>`,
`<created_by_me|shared_with_me>`. Backticks still improve their
readability, but they were never dropped.
174 lines
5.8 KiB
Markdown
174 lines
5.8 KiB
Markdown
# Documentation
|
|
|
|
This style guide is primarily for use with authoring documentation.
|
|
|
|
## General guidelines
|
|
|
|
- Use sentence case, even in titles (do not punctuate the title, though)
|
|
- Use the second person
|
|
- Use the active voice
|
|
- Use plural nouns and pronouns (_they_, _their_, or _them_), especially when
|
|
the specific number is uncertain (i.e., "Set up your environments" even though
|
|
you don't know if the user will have one or many environments)
|
|
- When writing documentation titles, use the noun form, not the gerund form
|
|
(e.g., "Environment Management" instead of "Managing Environments")
|
|
- Context matters when you decide whether to capitalize something or not. For
|
|
example,
|
|
["A Job creates one or more Pods..."](https://kubernetes.io/docs/concepts/workloads/controllers/job/)
|
|
is correct when writing about Kubernetes. However, in other contexts, neither
|
|
_job_ nor _pods_ would be capitalized. Please follow the conventions set forth
|
|
by the relevant companies and open source communities.
|
|
|
|
## Third-party references
|
|
|
|
If you have questions that aren't explicitly covered by this guide, consult the
|
|
following third-party references:
|
|
|
|
| **Type of guidance** | **Third-party reference** |
|
|
|----------------------|----------------------------------------------------------------------------------------|
|
|
| Spelling | [Merriam-Webster.com](https://www.merriam-webster.com/) |
|
|
| Style - nontechnical | [The Chicago Manual of Style](https://www.chicagomanualofstyle.org/home.html) |
|
|
| Style - technical | [Microsoft Writing Style Guide](https://docs.microsoft.com/en-us/style-guide/welcome/) |
|
|
|
|
## Tools
|
|
|
|
This repository runs [Vale](https://vale.sh/) on `docs/` as part of CI to enforce prose style.
|
|
The configuration is the repo-root `.vale.ini`, and the curated rule set is documented in [`docs/.style/style-guide/`](../../.style/style-guide/README.md).
|
|
Run the same checks locally with `make lint/prose`.
|
|
Vale runs in advisory mode in this iteration: warnings surface as inline PR annotations, but they don't block the build.
|
|
|
|
The following external tools can also help when drafting. Take their
|
|
suggestions with a grain of salt because they aren't tuned for Coder's
|
|
voice or product names:
|
|
|
|
- [alex.js](https://alexjs.com/)
|
|
- [Grammarly](https://app.grammarly.com/)
|
|
- [Hemingway Editor](https://hemingwayapp.com/)
|
|
|
|
## How to format text
|
|
|
|
Below summarizes the text-formatting conventions you should follow.
|
|
|
|
### Bold
|
|
|
|
Use **bold** formatting when referring to UI elements.
|
|
|
|
### Italics
|
|
|
|
Use _italics_ for:
|
|
|
|
- Parameter names
|
|
- Mathematical and version variables
|
|
|
|
### Code font
|
|
|
|
Use _code font_ for:
|
|
|
|
- User text input
|
|
- Command-line utility names
|
|
- DNS record types
|
|
- Environment variable names (e.g., `PATH`)
|
|
- Filenames, filename extensions, and paths
|
|
- Folders and directories
|
|
- HTTP verbs, status codes, and content-type values
|
|
- Placeholder variables (see [Placeholders in angle brackets](#placeholders-in-angle-brackets))
|
|
|
|
Use _code blocks_ for code samples and other blocks of code. Be sure to indicate
|
|
the language your using to apply the proper syntax highlighting.
|
|
|
|
```text
|
|
This is a codeblock.
|
|
```
|
|
|
|
For code that you want users to enter via a command-line interface, use
|
|
`console`, not `bash`.
|
|
|
|
### Placeholders in angle brackets
|
|
|
|
Placeholder values written in angle brackets **must** be wrapped in backticks so
|
|
they render as inline code. The documentation site renders Markdown as HTML, so
|
|
an unwrapped placeholder such as `<organization-name>` is parsed as an unknown
|
|
HTML tag and stripped out of the page, so readers never see it.
|
|
|
|
This applies wherever the text becomes documentation, including the Go CLI help
|
|
strings and Swagger annotations that generate the CLI and API reference.
|
|
|
|
```text
|
|
# Correct: wrap the placeholder in backticks
|
|
Structured as: `<organization-name>/<team-slug>`.
|
|
|
|
# Incorrect: the placeholder renders as "Structured as: /."
|
|
Structured as: <organization-name>/<team-slug>.
|
|
```
|
|
|
|
### Punctuation
|
|
|
|
Do not use the ampersand (&) as a shorthand for _and_ unless you're referring to
|
|
a UI element or the name of something that uses _&_.
|
|
|
|
You can use the symbol `~` in place of the word _approximately_.
|
|
|
|
### UI elements
|
|
|
|
When referring to UI elements, including the names for buttons, menus, dialogs,
|
|
and anything that has a name visible to the user, use bold font.
|
|
|
|
**Example:** On the **Environment Overview** page, click **Configure SSH**.
|
|
|
|
Don't use code font for UI elements unless it is rendered based on previously
|
|
entered text. For example, if you tell the user to provide the environment name
|
|
as `myEnvironment`, then use both bold and cold font when referring to the name.
|
|
|
|
**Example**: Click **`myEnvironment`**.
|
|
|
|
When writing out instructions that involve UI elements, both of the following
|
|
options are acceptable:
|
|
|
|
- Go to **Manage** > **Users**.
|
|
- In the **Manage** menu, click **Users**.
|
|
|
|
## Product-specific references
|
|
|
|
Below summarizes the guidelines regarding how Coder terms should be used.
|
|
|
|
### Capitalized terms
|
|
|
|
The only Coder-specific terms that should be capitalized are the names of
|
|
products (e.g., Coder).
|
|
|
|
The exception is **code-server**, which is always lowercase. If it appears at
|
|
the beginning of the sentence, rewrite the sentence to avoid this usage.
|
|
|
|
### Uncapitalized terms
|
|
|
|
In general, we do not capitalize the names of features (unless the situation
|
|
calls for it, such as the word appearing at the beginning of a sentence):
|
|
|
|
- account dormancy
|
|
- audit logs
|
|
- autostart
|
|
- command-line interface
|
|
- dev URLs
|
|
- environment
|
|
- image
|
|
- metrics
|
|
- organizations
|
|
- progressive web app
|
|
- registries
|
|
- single sign-on
|
|
- telemetry
|
|
- workspace
|
|
- workspace providers
|
|
- workspaces as code
|
|
|
|
We also do not capitalize the names of user roles:
|
|
|
|
- auditor
|
|
- member
|
|
- site admin
|
|
- site manager
|
|
|
|
## Standardized spellings
|
|
|
|
- WiFi
|