DevCats 5a241ebce2
feat: ttyd module (#790)
## Description

Add ttyd module that exposes any command as a web-based terminal via
[ttyd](https://github.com/tsl0922/ttyd).

- Run commands like `bash`, `htop`, or `tmux` accessible in the browser
- Supports readonly mode for log viewers
- Configurable sharing (owner/authenticated/public)
- Auto-installs ttyd binary (x86_64, aarch64, ARM)
- Works with subdomain or path-based routing


![TTYD-Module-Demo](https://github.com/user-attachments/assets/1c884e89-b1b1-4f1b-ab5b-56df3dd6d9af)

## Type of Change

- [X] New module
- [ ] New template
- [ ] Bug fix
- [ ] Feature/enhancement
- [ ] Documentation
- [ ] Other

## Module Information

<!-- Delete this section if not applicable -->

**Path:** `registry/coder-labs/modules/ttyd`  
**New version:** `v1.0.0`  
**Breaking change:** [ ] Yes [ ] No

## Testing & Validation

- [X] Tests pass (`bun test`)
- [X] Code formatted (`bun fmt`)
- [X] Changes tested locally

---------

Co-authored-by: blink-so[bot] <211532188+blink-so[bot]@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-09 16:19:10 +00:00

1.7 KiB

display_name description icon verified tags
ttyd Share a terminal command over the web via a Coder app ../../../../.icons/terminal.svg true
terminal
web
ttyd

ttyd

Run any command and expose it as a web-based terminal via ttyd. Each connection spawns a new process for the configured command. The terminal is accessible as a Coder app in the workspace UI.

module "ttyd" {
  count    = data.coder_workspace.me.start_count
  source   = "registry.coder.com/coder-labs/ttyd/coder"
  version  = "1.0.0"
  agent_id = coder_agent.main.id
  command  = "bash"
}

Examples

Custom command

module "ttyd" {
  count        = data.coder_workspace.me.start_count
  source       = "registry.coder.com/coder-labs/ttyd/coder"
  version      = "1.0.0"
  agent_id     = coder_agent.main.id
  display_name = "Shared Terminal"
  command      = "tmux new-session -A -s main"
  share        = "authenticated"
}

Readonly with custom ttyd options

module "ttyd" {
  count           = data.coder_workspace.me.start_count
  source          = "registry.coder.com/coder-labs/ttyd/coder"
  version         = "1.0.0"
  agent_id        = coder_agent.main.id
  command         = "tail -f /var/log/app.log"
  writable        = false
  additional_args = "-t fontSize=18"
}

Session Behavior

By default, each browser tab that opens the ttyd app spawns a new process for the configured command. Closing the tab kills that process.

To get a persistent, shared session that survives tab closes and allows multiple viewers, use tmux as the command (see example above). This requires tmux to be installed in the workspace image.