pcharbon

pcharbon

TermUi - a direct mode terminal user interface framework with components

A direct-mode Terminal UI framework for Elixir/BEAM, inspired by BubbleTea (Go) and Ratatui (Rust).

TermUI leverages BEAM’s unique strengths—fault tolerance, actor model, hot code reloading—to build robust terminal applications using The Elm Architecture.

Blue Theme Yellow Theme

Features

  • Elm Architecture - Predictable state management with init/update/view

  • Rich Widget Library - Gauges, tables, menus, charts, dialogs, and more

  • Efficient Rendering - Double-buffered differential updates at 60 FPS

  • Themable - True color RGB support (16 million colors)

  • Cross-Platform - Linux, macOS, Windows 10+ terminal support

  • OTP Integration - Supervision trees, fault tolerance, hot code reload

Installation

Add term_ui to your dependencies in mix.exs:

def deps do
  [
    {:term_ui, "~> 0.1.0"}
  ]
end

https://github.com/pcharbon70/term_ui

Most Liked

pcharbon

pcharbon


TermUI v0.2.0

New Widgets

Basic Widgets:

  • TextInput - Single-line and multi-line text input with cursor movement

Overlay Widgets:

  • AlertDialog - Modal dialog for confirmations with standard button configurations
  • ContextMenu - Right-click context menu with keyboard and mouse support

Layout Widgets:

  • Viewport - Scrollable view with keyboard and mouse support
  • SplitPane - Resizable multi-pane layouts for IDE-style interfaces
  • TreeView - Hierarchical data display with expand/collapse

Input Widgets:

  • FormBuilder - Structured forms with validation and multiple field types
  • CommandPalette - VS Code-style command discovery with fuzzy search

Visualization Widgets:

  • BarChart - Horizontal/vertical bar charts for categorical data
  • LineChart - Line charts using Braille characters for sub-character resolution
  • Canvas - Direct drawing surface for custom visualizations

Data Streaming Widgets:

  • LogViewer - High-performance log viewer with virtual scrolling and filtering
  • StreamWidget - GenStage-integrated widget with backpressure support

BEAM Introspection Widgets:

  • ProcessMonitor - Live BEAM process inspection with sorting and filtering
  • SupervisionTreeViewer - OTP supervision hierarchy visualization
  • ClusterDashboard - Distributed Erlang cluster monitoring

Other Changes

  • Added usage_rules for AI assistant integration - see usage_rules | Hex
  • Added README documentation for all 25 example directories
  • Fixed mouse tracking cleanup on application exit
  • Fixed ToastManager rendering
  • Improved ContextMenu mouse support and hover highlighting
  • Various bug fixes and documentation improvements
pcharbon

pcharbon

Yes unfortunately (or fortunately) you cant see the refresh. The rendering process uses two ETS buffers and only render a diff of the previous buffer and the next. I actually spent time trying to figure out why the refresh did not work haha

Note: you can see the past refresh by changing the theme.

kevinschweikert

kevinschweikert

I tried the dashboard example and the refresh did not update the view. Would that be caused by

because the state diff is the same?

Where Next?

Popular in Announcing Top

tmbb
I’ve published the first version of my Makeup library. It’s a syntax highlighter for Elixir in the spirit of Pygments, Currently it highl...
New
danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 29377 241
New
mischov
import Meeseeks.CSS html = HTTPoison.get!("https://news.ycombinator.com/").body for story <- Meeseeks.all(html, css("tr.athing")) do...
New
seancribbs
Today I released a new dialyzer Mix task as the dialyzex package! At the time we started writing this task, the existing dialyzer integra...
New
riverrun
I’ve just released version 3 of Comeonin, a password hashing library. The following small changes have been made: changes to the NIF c...
New
Qqwy
Hello everyone, I wrote a small library today called MapDiff. It returns a map listing the (smallest amount of) changes to get from map...
New
bluzky
You may know https://ui.shadcn.com/, a UI component library for React. I really love it’s design style and components. I’ve built some co...
384 13736 119
New
achempion
Hi, I would like to tell about my initiative to further maintain and develop Waffle project which is the fork of Arc library. The progre...
New
mattludwigs
Grizzly is a library for working with Z-Wave devices. Z-Wave is a low-frequency radio protocol for controlling smart home devices on a me...
New
pkrawat1
Hey guyz We at @aviabird are working on a payment library in elixir/phoenix. We are targeting March 2018 to add 56 Gateways to it. Have...
New

Other popular topics Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 30877 112
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement