NAME
Tachikoma.jl — Build rich terminal apps in Julia — widgets, layouts, sixel graphics, Kitty graphics, animations, and more
SYNOPSIS
https://github.com/kahliburke/Tachikoma.jl/releasesINFO
DESCRIPTION
Build rich terminal apps in Julia — widgets, layouts, sixel graphics, Kitty graphics, animations, and more
README
Tachikoma.jl
A terminal UI framework for Julia
Tachikoma is a pure-Julia framework for building rich, interactive terminal applications. It provides an Elm-inspired Model/update!/view architecture, a 60fps event loop with double-buffered rendering, 30+ composable widgets, constraint-based layouts, animation primitives, kitty/sixel pixel graphics, and built-in recording and export to SVG/GIF.
Features
Architecture — Declarative Elm pattern with clean separation of state, logic, and rendering. 60fps event loop with automatic frame pacing and double-buffered output.
30+ Widgets — Text inputs, text areas, code editor with syntax highlighting, data tables with column resize and sort, forms with validation and Tab navigation, tree views, charts, bar charts, sparklines, calendars, modals, dropdowns, radio groups, checkboxes, progress indicators, scrollable panes, markdown viewer, and more.
Constraint Layouts — Fixed, Fill, Percent, Min, Max, and Ratio constraints. Draggable resizable pane borders with layout persistence via Preferences.jl.
Animation — Tweens with 10 easing functions, physics-based springs, timelines for sequencing, and organic effects: noise, fbm, pulse, breathe, shimmer, jitter, flicker, drift, glow.
Graphics — Three rendering backends: Braille dots (2x4), quadrant blocks (2x2), and pixel rendering (16x32 per cell, Kitty or sixel). Vector drawing API with lines, arcs, circles, and shapes.
11 Themes — Cyberpunk, retro, and classic palettes (KOKAKU, ESPER, MOTOKO, KANEDA, NEUROMANCER, CATPPUCCIN, SOLARIZED, DRACULA, OUTRUN, ZENBURN, ICEBERG) with hot-swappable switching.
Recording & Export — Live recording via Ctrl+R, headless record_app()/record_widget() for CI, native .tach format with Zstd compression, export to SVG and GIF.
Async Tasks — Channel-based background work that preserves the single-threaded Elm architecture. Cancel tokens, timers, and repeat scheduling.
Testing — TestBackend for headless widget rendering with char_at(), style_at(), row_text(), find_text() inspection APIs. Property-based testing with Supposition.jl.
Quick Start
using Pkg
Pkg.add("Tachikoma")
using Tachikoma @tachikoma_app@kwdef mutable struct Life <: Model quit::Bool = false grid::Matrix{Bool} = rand(24, 80) .< 0.25 end
should_quit(m::Life) = m.quit function update!(m::Life, e::KeyEvent) e.key == :escape && (m.quit = true) end
function view(m::Life, f::Frame) h, w = size(m.grid) g = m.grid nc = [sum(g[mod1(i+di,h), mod1(j+dj,w)] for di in -1:1, dj in -1:1) - g[i,j] for i in 1:h, j in 1:w] g .= (nc .== 3) .| (g .& (nc .== 2)) a, buf = f.area, f.buffer cs = [:primary, :accent, :success, :warning, :error] for i in 1:min(h, a.height), j in 1:min(w, a.width) g[i,j] || continue set_char!(buf, a.x+j-1, a.y+i-1, '█', tstyle(cs[clamp(nc[i,j],1,5)])) end end
app(Life())
See the Getting Started guide for a more complete walkthrough with layouts, widgets, and input handling.
Demos
The demos/TachikomaDemos package includes 25+ interactive demos with a launcher menu:
using Pkg Pkg.activate("demos/TachikomaDemos") Pkg.instantiate()
using TachikomaDemos launcher() # interactive menu
Or run individual demos directly: dashboard(), snake(), life(), sysmon(), anim_demo(), chart_demo(), form_demo(), effects_demo(), and more.
Gallery
Dashboard![]() | Form with Validation![]() |
Animation Showcase![]() | Todo List![]() |
GitHub PR Viewer![]() | Constraint Explorer![]() |
Dotwave Background![]() | Phylogenetic Tree![]() |
Widget Catalog
| Category | Widgets |
|---|---|
| Text & Display | Block, Paragraph, BigText, StatusBar, Span, Separator, MarkdownPane |
| Input | TextInput, TextArea, CodeEditor, Checkbox, RadioGroup, DropDown, Button |
| Selection & Lists | SelectableList, TabBar, TreeView, Calendar |
| Data | DataTable, Chart, BarChart, Sparkline, Gauge, ProgressList |
| Layout | Container, ScrollPane, Scrollbar, Modal, Form |
| Graphics | Canvas, BlockCanvas, PixelImage |
Backgrounds
Procedural animated backgrounds that composite behind your UI:
| Preset | Description |
|---|---|
| DotWave | Undulating dot-matrix terrain with configurable wave layers |
| PhyloTree | Animated phylogenetic branching structures |
| Cladogram | Hierarchical cladogram tree visualizations |
Optional Extensions
# Markdown rendering
using CommonMark
# GIF export
using FreeTypeAbstraction, ColorTypes
# Tables.jl integration for DataTable
using Tables
Documentation
Full documentation is available at kahliburke.github.io/Tachikoma.jl.
| Section | Description |
|---|---|
| Getting Started | Build your first app in 30 lines |
| Architecture | The Elm architecture pattern in depth |
| Layout | Constraint-based layout system |
| Widgets | Complete catalog of all widgets |
| Animation | Tweens, springs, timelines, and organic effects |
| Graphics | Canvas, BlockCanvas, and pixel rendering |
| Themes | 11 built-in themes with hot-swap switching |
| Recording | Recording and export to SVG/GIF |
| Testing | TestBackend for headless widget testing |
| API Reference | Auto-generated API documentation |
Requirements
- Julia 1.10+
- A terminal with ANSI color support (most modern terminals)
- Kitty or sixel-capable terminal for pixel graphics (kitty, iTerm2, WezTerm, foot, etc.)
Contributing
Contributions are welcome. Please open an issue to discuss proposed changes before submitting a pull request.
License
MIT — see LICENSE for details.







