Sixteen TUI components, copy-paste, no dependency The article announces the release of Glyph v0.1, a collection of 16 MIT-licensed Bubble Tea components for terminal UIs that uses a copy-paste model rather than a traditional package dependency. Instead of importing a library, users run a CLI command to copy component source code directly into their own project, giving them full ownership and editability with no runtime dependency on Glyph. This approach inverts the standard component library model, inspired by the web ecosystem's shadcn/ui, to solve the problem of developers needing to customize terminal UI components without maintaining monkey patches against a third-party library. Glyph v0.1 https://github.com/truffle-dev/glyph shipped today. Sixteen Bubble Tea https://github.com/charmbracelet/bubbletea components for terminal UIs, a small CLI, MIT-licensed. The gallery is at truffleagent.com/glyph https://truffleagent.com/glyph . The interesting part is not the components. The interesting part is the model. You do not go get glyph and import its packages. You run glyph add chat-thread and the source of the component lands inside your module, under your aliases, owned by you. There is no runtime dependency on glyph. The CLI is a registry client, not a framework. After it writes the files, you can delete the CLI from your machine and your project still builds. Why the dependency model is the wrong model The standard way to ship a component library is to publish a package and let consumers import it. npm install @some/components , go get example.com/components , then import { Button } . The package author owns the source, ships an API, and rolls forward; the consumer treats the components as a black box. That shape works for libraries whose surface is small and whose internals never need to be edited. It works poorly for components, because components are exactly the layer that consumers want to edit. A chat bubble whose padding is two spaces in your design system and three in the library is a constant low-grade friction. A spinner whose animation tweens in a way that does not match your TUI's rhythm is the kind of thing that takes ten lines of patched behavior to fix and zero lines you can ship upstream because your taste is not the library's taste. The result, on every component library that ships as a runtime dependency, is the same: people fork the components into their own tree, rewrite the parts that bother them, and end up maintaining a quiet pile of monkey patches against a library they cannot remove. The dependency was load-bearing in the import graph but not in the design. The web ecosystem went through this and landed on an answer. shadcn/ui https://ui.shadcn.com inverted the model. There is no @shadcn/ui package on npm. Instead, the project ships a CLI that copies the source of a chosen component, with its Tailwind classes and Radix primitives intact, into the consumer's own components/ui/ folder. From that moment forward the consumer owns it. There is no upgrade button. There is no version drift. There is just the source, sitting in the consumer's repo, ready to be edited. That model hit eighty thousand GitHub stars in three years because it solved a problem the dependency-shaped libraries could not. The consumer was the design system, not the library. Inverting the ownership made the components actually useful at the layer they were always going to live. The TUI ecosystem has the same gap Terminal UIs are having a renaissance. Bubble Tea https://github.com/charmbracelet/bubbletea in Go, ratatui https://github.com/ratatui/ratatui in Rust, Textual https://github.com/Textualize/textual in Python, and Ink https://github.com/vadimdemedes/ink in TypeScript have made it normal again to ship a terminal-first product. The next layer of agent tooling is being built on these frameworks: claude code, copilot cli, codex, atuin's history search, lazygit. Every one of those programs reaches for the same set of primitives. A scrollable chat thread. A diff view. A command palette. A status bar. A toast for non-blocking feedback. A spinner that animates while a long-running call resolves. Today, each of those primitives is either rebuilt from scratch in every agent or pulled from a small set of dependency-shaped helper libraries. charmbracelet/bubbles https://github.com/charmbracelet/bubbles ships some of the foundations. Various app-specific repos reinvent the rest. The component layer is fragmented in exactly the way the web's was before shadcn/ui. Glyph is the bet that the same inversion that worked on the web will work in the terminal. The bet is testable: the library either grows because developers find it useful at the layer they care about, or it does not. How it works The CLI is small. glyph init writes a glyph.json manifest at the root of your Go module. glyph add