Build Go terminal user interfaces and interactive CLIs with the Charmbracelet ecosystem, especially Bubble Tea, Bubbles, Huh, Lip Gloss, Wish, Glamour, and Log. Use this skill when the user asks for a TUI, terminal UI, interactive CLI, Bubble Tea model/update/view code, Bubbles widgets, Huh forms, Lip Gloss layout or styling, Wish SSH apps, Glamour markdown rendering, or a polished Go terminal app.
Use this skill to build modern Go CLIs with the Charmbracelet stack. Default to Bubble Tea for any stateful TUI or interactive terminal flow, then layer in Bubbles, Huh, Lip Gloss, Wish, Glamour, and Log as needed.
charm.land/.../v2 imports for the current v2 ecosystem.stderr or files, not to the TUI surface.| Need | Use |
|---|---|
| Full TUI, app state, key handling, message loop | references/bubbletea-core.md |
| Real app architecture, commands, child models, async patterns |
references/bubbletea-patterns.md |
Reusable widgets like list, table, textinput, viewport, help | references/bubbles.md |
| Forms, prompts, wizards, embedded form screens | references/huh.md |
| Styling, spacing, borders, color, layout composition | references/lipgloss.md |
| SSH-native TUI or remote CLI app | references/wish.md |
| Markdown help panes, docs, release notes, previews | references/glamour.md |
| Structured CLI logging and diagnostics | references/log.md |
| High-level library chooser and API map | references/api-surface.md |
| Concrete implementation recipes | references/common-use-cases.md |
| Migration issues and footguns | references/troubleshooting-workarounds.md |
| Upstream example shortlist | references/examples.md |
tea.Cmd, not directly in Update or View.tea.WindowSizeMsg and keep layouts responsive.tea.RequestBackgroundColor when styles depend on light/dark mode.tea.View fields like AltScreen and MouseMode.stderr or a file, not to stdout.package main
import tea "charm.land/bubbletea/v2"
type model struct{}
func (m model) Init() tea.Cmd {
return nil
}
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyPressMsg:
switch msg.String() {
case "q", "ctrl+c":
return m, tea.Quit
}
}
return m, nil
}
func (m model) View() tea.View {
v := tea.NewView("Hello from Bubble Tea")
return v
}
references/bubbletea-core.md for Bubble Tea's model, commands, messages, and program lifecycle.references/bubbletea-patterns.md for app structure, async work, Cobra integration, and multi-model composition.references/troubleshooting-workarounds.md before migrating old Charmbracelet code or mixing stale examples with v2 code.