Normalizes non-standard code-fence language tags across `docs/**` so a strict highlighter (Shiki, used by Fumadocs) won't fail the build on an unrecognized language, and unifies redundant synonym tags onto one canonical form per language. The current renderer (Speed-Highlight) detects the language from the code content, not the fence label, so this drift wasn't visible until now. ## Changes - `hcl` -> `tf` (199 fences, including indented ones nested in numbered/bulleted lists). Shiki ships `hcl` and `terraform` as two distinct grammars (not aliases); every `hcl`-tagged fence in `docs/**` is actually Terraform resource/data/provider syntax, so the more specific `terraform` grammar is correct for all of them. `tf` is Shiki's own alias for that grammar, and it's also what GitHub's own markdown renderer resolves to the same HCL/Terraform highlighting. - `pwsh`/`powershell` -> `ps1`. Both `ps` and `ps1` are registered PowerShell aliases in Shiki, but on GitHub's renderer only `.ps1` is a registered file extension (`.ps` isn't), so `ps1` renders identically to `powershell` there today while bare `ps` would silently lose highlighting. - `env` -> `dotenv` (a dedicated Shiki grammar for `KEY=VALUE` files) - `text`/`output`/`none`/`url` -> `txt`. Same built-in plain-text fallback either way, just shorter. - `Dockerfile` -> `dockerfile` (lowercase) - `bash`/`shell` -> `sh` (732 fences). Shiki and GitHub both alias all three to a single shell grammar; this was already the style guide's stated preference, just not enforced across the existing corpus until now. - `markdown` -> `md` (4 fences). Alias of the same grammar in both Shiki and GitHub. - `jsonc` -> `json` (1 fence). The block has no comments or trailing commas, so it doesn't need the comments-capable grammar. - `ts` -> `tsx` (2 fences, `docs/about/contributing/frontend.md`). Verified the actual content tokenizes identically under both grammars, and a sibling block in the same file already needs `tsx` for real JSX, so unifying to one tag is safe for this file. Documented a caveat: `tsx` mis-tokenizes the legacy angle-bracket type-assertion syntax (`<Type>value`), which is invalid in real `.tsx` files anyway, so use `value as Type` instead. - `yml` -> `yaml` (1 fence) - Updated `docs/.style/style-guide/formatting.md` to document all canonical tags `promql` (2 fences) and `caddyfile` (2 fences) are left as-is. Shiki doesn't bundle a grammar for either, so they need a custom grammar registration when the site adopts Shiki, rather than degrading to `txt`. Tracked as follow-up work under DOCS-118 and [DOCS-544](https://linear.app/codercom/issue/DOCS-544/vendor-a-local-promql-grammar-for-shiki-syntax-highlighting) (promql). Does not touch `offlinedocs/`. Linear: [DOCS-476](https://linear.app/codercom/issue/DOCS-476/normalize-docs-code-fence-languages-de-risk-shikifumadocs) <details> <summary>How the fence tags were verified</summary> Each tag was tested against a real `shiki@latest` highlighter instance (`codeToHtml`/`codeToTokens`) and cross-checked against GitHub's `@wooorm/starry-night` grammar sources (the renderer that actually displays these `.md` files today, in repo browsing and PR diffs), since that's what determines whether brevity is safe before Shiki adoption: ```text FAIL env -- Language `env` is not included in this bundle. FAIL Dockerfile -- Language `Dockerfile` is not included in this bundle. FAIL promql -- Language `promql` is not included in this bundle. FAIL caddyfile -- Language `caddyfile` is not included in this bundle. FAIL pwsh -- Language `pwsh` is not included in this bundle. FAIL output -- Language `output` is not included in this bundle. ``` `hcl` doesn't error in Shiki, since it's a real grammar, but that's exactly the trap: it was silently rendering every fence with the generic HCL grammar instead of the Terraform-specific one. Every `hcl`-tagged fence in `docs/**` was manually checked against `origin/main` and is genuinely Terraform content. For `ts`/`tsx`, tokenizing the actual doc content confirmed identical output under both grammars; a synthetic test with the legacy angle-bracket cast syntax confirmed `tsx` degrades on that specific construct, which the style guide now calls out. The first normalization pass only matched fence tags at column 0 (`^```tag$`), missing tags indented inside numbered/bulleted lists. A follow-up pass caught the remaining occurrences at any indentation level. </details> --- *This PR description and the underlying changes were prepared with Coder Agents assistance.*
7.6 KiB
Access your workspace
There are many ways to connect to your workspace, the options are only limited by the template configuration.
Deployment operators can learn more about different types of workspace connections and performance in our networking docs.
You can see the primary methods of connecting to your workspace in the workspace dashboard.
Web Terminal
The Web Terminal is a browser-based terminal that provides instant access to your workspace's shell environment. It uses xterm.js and WebSocket technology for a responsive terminal experience with features like persistent sessions, Unicode support, and clickable URLs.
Read the complete Web Terminal documentation for customization options, keyboard shortcuts, and troubleshooting guides.
SSH
Through with the CLI
Coder will use the optimal path for an SSH connection (determined by your deployment's networking configuration) when using the CLI:
coder ssh my-workspace
Or, you can configure plain SSH on your client below.
Note
The
coder sshcommand does not have full parity with the standard SSH command. For users who need the full functionality of SSH, use the configuration method below.
Running remote commands with quoting
Arguments after -- are joined with spaces into a single command
string before being sent to the workspace agent (per
RFC 4254 §6.5,
which defines the SSH exec request as a single string). Your local
shell consumes outer quotes before the CLI ever sees the arguments,
so inner quoting is not preserved on the wire.
This means a common pattern from interactive shells does not behave as you might expect:
# Surprising: prints an empty line, NOT "ready"
coder ssh my-workspace -- bash -c 'echo ready'
The local shell strips the single-quotes, the CLI receives the argv
[bash, -c, echo, ready], and the remote agent runs
bash -c echo ready; echo gets no arguments and ready is bound to
$0. The same caveat applies to plain ssh user@host -- bash -c '...';
this is SSH protocol semantics, not a coder ssh limitation.
For commands that need preserved quoting, use one of these patterns:
Heredoc via stdin (recommended for multi-line scripts):
coder ssh my-workspace -- bash <<'EOF'
echo ready
EOF
A single-argument script payload:
coder ssh my-workspace -- /path/to/script.sh
Exit-code-only probe (when you only need to know if the command succeeded):
coder ssh my-workspace -- true && echo "agent is reachable"
Configure SSH
Coder generates SSH key pairs for each user to simplify the setup process.
-
Use your terminal to authenticate the CLI with Coder web UI and your workspaces:
coder login <accessURL> -
Access Coder via SSH:
coder config-ssh -
Run
coder config-ssh --dry-runif you'd like to see the changes that will be before you proceed:coder config-ssh --dry-run -
Confirm that you want to continue by typing yes and pressing enter. If successful, you'll see the following message:
You should now be able to ssh into your workspace. For example, try running: $ ssh coder.<workspaceName>
Your workspace is now accessible via ssh coder.<workspace_name>
(for example, ssh coder.myEnv if your workspace is named myEnv).
Tip
If you use a third-party SSH client that discovers hosts by parsing
~/.ssh/config(such as the VS Code Remote-SSH sidebar or scripts that enumerate known hosts), runcoder config-ssh --no-wildcardinstead. This generates an individualHostentry per workspace rather than a single wildcard block, making your workspaces visible to those tools.
Visual Studio Code
You can develop in your Coder workspace remotely with VS Code. We support connecting with the desktop client and VS Code in the browser with code-server.
Read more details on using VS Code in your workspace.
Cursor
Cursor is an IDE built on VS Code with enhanced AI capabilities. Cursor connects using the Coder extension.
Read more about using Cursor with your workspace.
Windsurf
Windsurf is Codeium's code editor designed for AI-assisted development. Windsurf connects using the Coder extension.
Antigravity
Antigravity is Google's desktop IDE. Antigravity connects using the Coder extension.
Read more about using Antigravity with your workspace.
JetBrains IDEs
We support JetBrains IDEs using Gateway. The following IDEs are supported for remote development:
- IntelliJ IDEA
- CLion
- GoLand
- PyCharm
- Rider
- RubyMine
- WebStorm
- JetBrains Fleet
Read our docs on JetBrains for more information on connecting your JetBrains IDEs.
code-server
code-server is our supported method of running VS Code in the web browser. Learn more about what makes code-server different from VS Code web or visit the documentation for code-server.
Other Web IDEs
We support a variety of other browser IDEs and tools to interact with your workspace. Each of these can be configured by your template admin using our Web IDE guides.
Supported IDEs:
- VS Code Web
- JupyterLab
- RStudio
- Airflow
- File Browser
Our Module Registry also hosts a variety of tools for extending the capability of your workspace. If you have a request for a new IDE or tool, please file an issue in our Modules repo.
Coder Desktop
Coder Desktop is a native application that provides seamless access to your workspaces via a VPN tunnel. With Coder Desktop, you get:
- Automatic port forwarding: All workspace ports are available at
workspace-name.coder:PORTwith no manual setup - SSH access: Connect with
ssh workspace-name.coderusing any SSH client - File sync: Bidirectional file synchronization between local and remote directories
Coder Desktop is the recommended way to access workspace services for developers who want a seamless, native experience.
Ports and Port forwarding
You can manage listening ports on your workspace page through the listening ports window in the dashboard. These ports are often used to run internal services or preview environments.
Tip
For automatic access to all ports without manual configuration, use Coder Desktop.
You can also share ports with other users,
or port-forward through
the CLI with coder port forward. Read more in the
docs on workspace ports.
Remote Desktops
Coder also supports connecting with an RDP solution, see our RDP guide for details.




