Skip to content

Tachikoma vs Ratatui

Tachikoma.jl and Ratatui share the immediate-mode rendering model and constraint-based layouts. This page highlights similarities and differences.

Architecture

FeatureTachikoma.jlRatatui
LanguageJuliaRust
Rendering modelImmediate modeImmediate mode
App patternElm architecture (Model → update! → view)User-managed event loop
State managementMutable model structUser-managed
Event loopBuilt-in app() with configurable FPSManual (crossterm/termion)
Default bindingsBuilt-in (theme, settings, help overlays)None

Layout System

FeatureTachikoma.jlRatatui
Constraint typesFixed, Fill, Percent, Min, Max, RatioLength, Fill, Percentage, Min, Max, Ratio
Flex alignmentlayout_start, layout_center, layout_end, layout_space_between, layout_space_around, layout_space_evenlyFlex::Start, Flex::Center, Flex::End, Flex::SpaceBetween, Flex::SpaceAround, Flex::SpaceEvenly
SpacingLayout(dir, constraints; spacing=n)Layout::default().spacing(n)
Resizable panesResizableLayout with mouse dragNot built-in

Widgets

WidgetTachikoma.jlRatatui
Block (borders)Block with BOX_ROUNDED, BOX_HEAVY, etc.Block with BorderType
ParagraphParagraph with SpanParagraph with Span
ListSelectableList with mouse supportList
TableTable, DataTable (sortable, filterable)Table
TabsTabBarTabs
GaugeGauge with animation tickGauge, LineGauge
SparklineSparklineSparkline
BarChartBarChart with BarEntryBarChart with Bar
ChartChart with DataSeries (line/scatter)Chart with Dataset
CalendarCalendarMonthly (ratatui-widgets)
CanvasCanvas, BlockCanvas, PixelCanvasCanvas
ScrollbarScrollbar, ScrollPaneScrollbar
BigTextBigTextBigText (ratatui-widgets)
ModalModalNot built-in
FormForm with FormFieldNot built-in
TreeViewTreeView with TreeNodeTree (tui-tree-widget)

Tachikoma-Only Features

FeatureDescription
Input widgetsTextInput, TextArea, CodeEditor, Checkbox, RadioGroup, DropDown
Form systemForm / FormField with focus navigation and validation
FocusRingAutomatic Tab/Shift-Tab navigation between widgets
Animation systemTween, Spring, Timeline (sequence, stagger, parallel)
Organic effectspulse, breathe, shimmer, noise, fbm, color_wave
Buffer fillsfill_gradient!, fill_noise!, border_shimmer!
BackgroundsDotWaveBackground, PhyloTreeBackground, CladogramBackground
Pixel graphicsPixelImage, PixelCanvas for pixel-perfect raster rendering (Kitty or sixel)
Theme system11 built-in themes (kokaku, esper, motoko, etc.) with live switching
Settings overlayCtrl+S opens in-app settings (theme, animations, backgrounds)
Async tasksTaskQueue / spawn_task! for non-blocking background work
MarkdownPaneCommonMark rendering with scroll support
Pattern matching@match integration for event handling
Recording & exportrecord_app, record_widget.tach, .svg, .gif
ProgressListTask status list with task_done, task_running, task_pending
ContainerAutomatic widget layout positioning
StatusBarFull-width bar with left/right aligned spans

Ratatui-Only Features

FeatureDescription
Rust ecosystemAccess to the full Rust crate ecosystem
PerformanceZero-cost abstractions, no GC pauses
Backend choiceCrossterm, termion, or termwiz backends
Widget cratesLarge ecosystem of community widgets
Color typesColor::Rgb, Color::Indexed, Color::Reset
ModifiersFine-grained text modifiers (BOLD, ITALIC, UNDERLINED, etc.)
Masked inputBuilt-in password/masked text input

Migration Guide

If you're coming from Ratatui to Tachikoma:

RatatuiTachikoma.jl
Frame::render_widget(w, area)render(widget, area, buf)
Layout::default().constraints([...]).split(area)split_layout(Layout(dir, [...]), area)
Paragraph::new(vec![Span::styled(...)])Paragraph([Span("...", style)])
Block::default().title("...").borders(Borders::ALL)Block(title="...", border_style=tstyle(:border))
ListState { selected: Some(i) }SelectableList(...; selected=i)
event::read()?update!(model, evt) callback
Terminal::draw(|f| { ... })?view(model, frame) callback