# Web Terminal The Web Terminal is a browser-based terminal interface that provides instant access to your workspace's shell environment directly from the Coder dashboard. It's automatically enabled for all workspaces and requires no additional configuration. ![Terminal Access](../../images/user-guides/terminal-access.png) ## Overview The Web Terminal leverages [xterm.js](https://xtermjs.org/), an industry-standard terminal emulator, combined with WebSocket technology to provide a responsive and feature-rich terminal experience in your browser. ### Key Features - **Instant Access**: Click the terminal icon in your workspace to open a shell session - **Persistent Sessions**: Sessions are maintained using reconnection tokens, allowing you to resume your terminal even after page refreshes or network interruptions - **Full Unicode Support**: Displays international characters and emojis correctly - **Clickable Links**: Automatically detects and makes URLs clickable - **Copy/Paste Support**: Select text to automatically copy it to your clipboard - **Multiple Rendering Options**: Choose between different rendering engines for optimal performance ## Accessing the Terminal ### From the Dashboard 1. Navigate to your workspace in the Coder dashboard 2. Click the **Terminal** button or icon 3. The terminal will open in a new browser tab or window The terminal automatically connects to your workspace agent using an optimized WebSocket connection. ### Direct URL Access You can also bookmark or share direct terminal URLs: ```text https://coder.example.com/@username/workspace-name/terminal ``` To access a specific agent in a multi-agent workspace: ```text https://coder.example.com/@username/workspace-name.agent-name/terminal ``` ## Architecture ### How It Works The Web Terminal creates a persistent connection between your browser and the workspace: 1. **Browser**: Renders the terminal using xterm.js 2. **WebSocket**: Maintains a persistent, low-latency connection 3. **Coder Server**: Routes traffic between browser and workspace 4. **Workspace Agent**: Manages the pseudo-terminal (PTY) session 5. **Shell Process**: Your actual bash/zsh/fish shell The connection flow is: Browser ↔ WebSocket ↔ Coder Server ↔ Workspace Agent ↔ Shell Process ### Reconnection & Persistence The terminal uses reconnection tokens to maintain session state: - Each terminal session has a unique UUID - If the connection drops, the same token is used to reconnect - The workspace agent buffers output during disconnections - Your shell session continues running even when the browser is closed ## Customization ### Font Selection You can customize the terminal font through your user settings: 1. Click your avatar in the top-right corner 2. Select **Settings** → **Appearance** 3. Choose from available fonts: - **IBM Plex Mono** (default) - **Fira Code** (with ligatures) - **JetBrains Mono** - **Source Code Pro** The font change applies immediately to all open terminal sessions. ### Rendering Engine Administrators can configure the terminal renderer for performance optimization: ```yaml # In your Coder deployment configuration webTerminalRenderer: "canvas" # Options: canvas, webgl, dom ``` Or via environment variable: ```bash CODER_WEB_TERMINAL_RENDERER=canvas ``` **Renderer Options:** - **`canvas`** (default): Best compatibility, good performance on most systems - **`webgl`**: Hardware-accelerated, ideal for high-refresh terminals and complex rendering - **`dom`**: Fallback option, useful for accessibility tools or older browsers > **Note:** The renderer setting is deployment-wide and requires a Coder server > restart to take effect. ## Keyboard Shortcuts The Web Terminal supports standard terminal keybindings: | Shortcut | Action | |-------------------------------------|---------------------------| | `Ctrl+Shift+C` (Mac: `Cmd+Shift+C`) | Copy selected text | | `Ctrl+Shift+V` (Mac: `Cmd+Shift+V`) | Paste from clipboard | | `Shift+Enter` | Insert literal newline | | `Ctrl+C` | Send interrupt (SIGINT) | | `Ctrl+D` | Send EOF / exit shell | | `Ctrl+Z` | Suspend process (SIGTSTP) | ### Copy/Paste Behavior - **Auto-copy**: Selecting text automatically copies it to your clipboard - **Paste**: Use the standard paste shortcut or middle-click (on Linux/X11) - **Browser permissions**: First paste may prompt for clipboard access ## URL Handling The terminal automatically detects URLs and makes them clickable. When you click a URL: - **External URLs** (e.g., `https://example.com`) open in a new tab - **Localhost URLs** (e.g., `http://localhost:3000`) are automatically port-forwarded through Coder's [port forwarding](./port-forwarding.md) system - **Port-forwarded URLs** use your configured workspace proxy This makes it seamless to open development servers running in your workspace. ## Advanced Usage ### Custom Commands You can open a terminal with a specific command by adding a query parameter: ```text https://coder.example.com/@user/workspace/terminal?command=htop ``` This will execute `htop` immediately when the terminal opens. ### Container Selection For workspaces with multiple Docker containers, specify which container to connect to: ```text https://coder.example.com/@user/workspace/terminal?container=sidecar ``` You can also specify the container user: ```text https://coder.example.com/@user/workspace/terminal?container=app&container_user=node ``` > **Note:** This feature only works with Docker containers. ### Debug Mode Enable debug information to monitor connection latency: ```text https://coder.example.com/@user/workspace/terminal?debug ``` This displays the current latency to your selected workspace proxy in the bottom-right corner. ## Configuration File Support The Web Terminal uses xterm.js under the hood, which is configured programmatically rather than through a configuration file. However, you can customize various aspects: ### User-Side Customization End-users can customize: - **Font family** via Settings → Appearance - **Shell environment** via dotfiles or shell rc files - **TERM variable** is automatically set to `xterm-256color` ### Shell Configuration The terminal respects your shell's configuration files: ```bash # ~/.bashrc or ~/.zshrc export PS1="\u@\h:\w\$ " # Custom prompt alias ll="ls -lah" # Custom aliases # Set terminal colors export CTERM=xterm-256color ``` ## Troubleshooting ### Connection Issues If the terminal fails to connect: 1. **Check workspace status**: Ensure your workspace is running 2. **Verify agent health**: Look for agent connection warnings 3. **Network issues**: Check if WebSockets are blocked by your firewall/proxy 4. **Browser console**: Open DevTools to see WebSocket error messages ### Display Issues If characters or colors appear incorrect: 1. **Unicode support**: Ensure your shell locale is set correctly (`locale -a`) 2. **Terminal type**: The terminal sets `TERM=xterm-256color` automatically 3. **Color schemes**: Some applications may not render correctly in dark mode 4. **Font rendering**: Try switching terminal fonts in your appearance settings