Hello again
!
Quick update on Termisu. It’s grown up a bit since my intro post. Just shipped v0.0.2!
Little screen capture:

What you get:
- Cell-based rendering with double buffering and smart diffing
- Async events via fibers + channels (keyboard, mouse, resize, timers)
- Colors - ANSI 8/256, RGB, grayscale (Color.red, Color.rgb(255, 100, 50))
- Attributes - bold, dim, italic, underline, blink, reverse
- Input - full key detection with modifiers, case-insensitive helpers (key.q?, key.ctrl?)
code example:
termisu = Termisu.new
begin
termisu.enable_timer(16.milliseconds) # ~60fps
attr = Termisu::Attribute::Bold | Termisu::Attribute::Underline
termisu.set_cell(0, 0, 'H', fg: Termisu::Color.red, attr: attr)
termisu.set_cell(1, 0, 'i', fg: Termisu::Color.green, attr: attr)
termisu.set_cursor(3, 0)
termisu.render
termisu.each_event do |event|
case event
when Termisu::Event::Key
break if event.key.q? || event.ctrl_c?
when Termisu::Event::Mouse
termisu.set_cell(event.x - 1, event.y - 1, '*', fg: Termisu::Color.yellow)
termisu.render
when Termisu::Event::Resize
termisu.sync
when Termisu::Event::Tick
# animate stuff ✨
end
end
ensure
termisu.close
end
zero dependencies beyond stdlib.
Source: GitHub - omarluq/termisu: A minimalistic API for writing text-based user interfaces in pure Crystal
Docs: termisu main-dev
Would love feedback. What would make this useful for your projects?