
Box CLI Maker is a Go library for rendering highly customizable boxes in the terminal.

WrapContent and WrapLimit#RGB, #RRGGBB, rgb:RRRR/GGGG/BBBB, rgba:RRRR/GGGG/BBBB/AAAARender, plus MustRender for panic‑on‑error go get github.com/box-cli-maker/box-cli-maker/v3
package main
import (
"fmt"
box "github.com/box-cli-maker/box-cli-maker/v3"
)
func main() {
b := box.NewBox().
Style(box.Single). // single-line border
Padding(2, 1). // inner padding: x (horizontal), y (vertical)
TitlePosition(box.Top).
ContentAlign(box.Center).
Color(box.Cyan).
TitleColor(box.BrightYellow)
out, err := b.Render("Box CLI Maker", "Render highly customizable boxes\n in the terminal")
if err != nil {
panic(err)
}
fmt.Println(out)
}
NewBox constructs a box with the default Single style.
Configure it via fluent methods, then call Render (or MustRender) to get the box as a string.
b := box.NewBox() // recommended
You can clone a configured box and tweak it:
base := box.NewBox().
Style(box.Single).
Padding(2, 1).
ContentAlign(box.Left)
info := base.Copy().Color(box.Green)
warn := base.Copy().Color(box.Yellow)
Select a built‑in style:
b.Style(box.Double)
box.Single

box.SingleDouble

box.Double

box.DoubleSingle

box.Bold

box.Round

box.Hidden

box.Classic

box.Block

You can override any glyph after choosing a style:
b.Style(box.Single).
TopLeft("+").
TopRight("+").
BottomLeft("+").
BottomRight("+").
Horizontal("-").
Vertical("|")
Title position:
b.TitlePosition(box.Inside) // default
b.TitlePosition(box.Top)
b.TitlePosition(box.Bottom)
box.Inside

box.Top

box.Bottom

Content alignment:
b.ContentAlign(box.Left) // default
b.ContentAlign(box.Center)
b.ContentAlign(box.Right)
box.Left

box.Center

box.Right

b.Padding(px, py) // horizontal (px) and vertical (py) padding
b.HPadding(px) // horizontal only
b.VPadding(py) // vertical only
Negative padding values are allowed to be set but cause Render to return an error.
b.WrapContent(true) // enable wrapping (default width: 2/3 of terminal)
b.WrapLimit(40) // set explicit wrap width (enables wrapping)
b.WrapContent(false) // disable wrapping
Render returns an error if the wrap limit is negative or the terminal width cannot be determined when wrapping is enabled without a limit.
Colors can be applied to:
TitleColorContentColorColorAccepted formats:
box.Black, box.Red, box.Green, box.Yellow, box.Blue, box.Magenta, box.Cyan, box.White and their bright variants:
box.BrightBlack, box.BrightRed, box.BrightGreen, box.BrightYellow, box.BrightBlue, box.BrightMagenta, box.BrightCyan, box.BrightWhite
(plus a few aliases like box.HiRed, box.HiBlue, etc.)
Hex and XParseColor formats (Supports TrueColor and 8-bit):
#RGB
#RRGGBBrgb:RRRR/GGGG/BBBBrgba:RRRR/GGGG/BBBB/AAAAExample:
b.TitleColor(box.BrightYellow)
b.ContentColor("#00FF00")
b.Color("rgb:0000/ffff/0000")
Invalid colors cause Render to return an error.
out, err := b.Render("Title", "Content")
if err != nil {
// handle invalid style, colors, padding, wrapping, etc.
}
fmt.Println(out)
Render returns an error if:
BoxStyle is invalidTitlePosition is invalidInside title positionFor convenience:
out := b.MustRender("Title", "Content") // panics on error
The examples directory contains small, focused programs that showcase different features:
simple_box – minimal single box with title and content.content_align – compare Left, Center, and Right content alignment.content_wrap – demonstrate WrapContent / WrapLimit with long text.title_positions – show Inside, Top, and Bottom title placement.box_styles – render all built‑in border styles and colors.custom_box – build boxes using fully custom corner/edge glyphs.ansi_styles_and_links – use bold/underline/blink/strikethrough and OSC 8 hyperlinks.colors_and_unicode – mix hex/ANSI colors with CJK, emoji, and wrapping.ansi_art – render more decorative/"artistic" boxes.shared_styles – derive multiple boxes from a shared base style with Copy.ksctl – real‑world example from ksctl showing wide titles vs narrow content.lolcat – rainbow color demo using custom ANSI styling helpers.readme – code used to generate the screenshot at the top of this README.This library uses mattn/go-runewidth and github.com/charmbracelet/x/ansi to handle:
Note:
v3 is a new major version with a redesigned API.
Key changes:
Config struct and New(Config) have been replaced with:go
b := box.NewBox().
Style(box.Single).
Padding(2, 1).
TitlePosition(box.Top).
ContentAlign(box.Left)
Type, ContentAlign, TitlePos) are now strongly typed:"Single" → box.Single"Top" → box.Top"Center" → box.Center
Colors:
interface{} colors (uint, [3]uint, etc.).Invalid colors now error at Render time.
Print / Println behavior can be replicated by fmt.Println(b.MustRender(...)) or your own helper.
Read more at Migration guide.
The old v2 API remains available at:
go get github.com/Delta456/box-cli-maker/v2
but is no longer actively developed.
Thanks to:
for inspiration, and to all contributors who have improved this library over time.
Licensed under MIT.
$ claude mcp add box-cli-maker \
-- python -m otcore.mcp_server <graph>