Skip to content
A dado dashboard rendered in the terminal

dado

Beautiful terminal UIs for Go. Themeable, composable, and built on tcell.

54 Components

Data grids, charts, modals, forms, git graphs, node graphs, and more — all ready to drop into your TUI app.

26 Built-in Themes

Nord, Dracula, Catppuccin, Tokyo Night, Gruvbox, Rosé Pine, and many more. Switch themes at runtime with a single call.

Built on tcell

dado renders directly on gdamore/tcell through its own widget core, adding a composable component model, theming, and a typed event system on top of a rock-solid foundation.

Typed Event System

Focus, key, change, submit, and activate events flow through a consistent typed interface across every component.

package main
import (
"log"
"github.com/atterpac/dado/components"
"github.com/atterpac/dado/layout"
"github.com/atterpac/dado/theme"
"github.com/atterpac/dado/theme/themes"
"github.com/atterpac/dado/core"
)
// HomeView is a page in the app. Embedding *components.ComponentBase
// supplies the nav.Component lifecycle (Name/Start/Stop/Hints) for free and
// delegates rendering to the wrapped core.Widget — here a *core.Flex.
// No lifecycle boilerplate required.
type HomeView struct {
*components.ComponentBase
}
func NewHomeView() *HomeView {
flex := core.NewFlex().SetDirection(core.Row)
// Drop components straight into the layout.
flex.AddItem(components.NewBadge("Ready").SetVariant(components.BadgeSuccess), 0, 1, false)
flex.AddItem(components.NewBadge("3").SetVariant(components.BadgeError).SetPill(true), 0, 1, false)
return &HomeView{
ComponentBase: components.NewComponentBase(flex).SetName("Home"),
}
}
func main() {
theme.SetProvider(themes.Nord) // one of 26 built-in themes
app := layout.NewApp(layout.AppConfig{})
app.Pages().Push(NewHomeView())
if err := app.Run(); err != nil {
log.Fatal(err)
}
}