[ANN] Tachikoma.jl — A terminal UI framework for Julia

@kahliburke Let me know if you’d rather have this feedback as an issue, but going through the demos, it seems like pixel graphics are not working in WezTerm, despite WezTerm’s supposed support for both Kitty and Sixel graphics (in addition to the iTerm protocol, which I use most of the time)

BTW, thanks for adding the light themes. They look good! I might want a bit more contrast (actually black foreground text instead of gray), but that’s something to play around with at some point…

1 Like
julia> using Pkg

julia> Pkg.activate("demos/TachikomaDemos")
  Activating new project at `C:\Users\me\demos\TachikomaDemos`

julia> Pkg.instantiate()
  No Changes to `C:\Users\me\demos\TachikomaDemos\Project.toml`
  No Changes to `C:\Users\me\demos\TachikomaDemos\Manifest.toml`

julia> using TachikomaDemos
ERROR: ArgumentError: Package TachikomaDemos not found in current path.
- Run `import Pkg; Pkg.add("TachikomaDemos")` to install the TachikomaDemos package.

I don’t understand how the existing instructions can work without setting a
working directory containing demos/TachikomaDemos. Looking at the source
tree for Tachikoma it appears that there is a demos directory containing a
TachikomaDemos directory with the sources for that package. Maybe the
instructions would work if you start from the install location for Tachikoma?

If I cd to .julia/packages/Tachikoma/...../demos/TachikomaDemos/ then
the commands work and I am able to run launcher() and all the demos including
the Life one which now has more pixels and equal aspect ratios in the display x,y.

Nice!

I don’t have any ideas on how to have the demos more integrated with the
module. You could register a module for the demos as one approach.

-chm

Actually, I think it was just that I was making my terminal too large. This is what “full screen” looks like for the “PixelImage Demo”

And, for the “Sixel Gallery”

Those looked like they were potentially just unicode block drawing characters (you’re going to have to look at these at full size, not the scaled-down display in Discourse), but I think that it’s just the actual image data that’s limited here. When I make my terminal smaller, it looks like

and

respectively, which looks very pixel-level.

These seem to be auto-detected Sixel graphics.

If I force the kitty protocol with export TACHIKOMA_GFX=kitty, neither demo shows any image data. Maybe because, as it turns out WezTerm only supports that protocol partially. It also doesn’t work inside tmux, but then, I don’t think I ever really tried to get Sixel working inside tmux, and probably could spend more time on that. It does work over SSH!

I tried out the kitty-protocol too, inside the actual Kitty terminal emulator. The animation performance in full-screen is much better. Not surprising, since Sixel has a reputation for being low-performance. I don’t know if adding support for the iTerm Inline Images Protocol, which WezTerm also supports (and which I use routinely and have working inside tmux), would be an option that would provide better performance

Hi @goerz !

Are you using macOS (maybe yes due to the screenshots)? If so, I think there is a bug with WezTerm and kitty graphics

1 Like

Tachikoma.jl v2.0.1 — Every frame, right on time

Hi everyone! Tachikoma.jl v2.0.1 is out with a bunch of fixes and improvements since the v2.0 launch.

Highlights:

  • Frame timing is back to rock-solid — restored deadline-based frame pacer that locks precisely to target FPS (60, 120, 240, whatever you throw at it). The v2.0 Timer+Channel mechanism introduced ~2ms jitter per frame; this release fixes it with cooperative sleep() that also keeps sixel rendering flicker-free.

  • Full Unicode grapheme support — zero-width combining marks (, ), CJK wide characters (你好), and precomposed glyphs now render correctly across all widgets: Paragraph, Table, TabBar, StatusBar, and the terminal emulator. Thanks to @ronisbr for the core Cell/Buffer work.

  • New WidgetScroll widget — wrap any widget in a scrollable 2D viewport with click-drag panning, scroll wheel, keyboard navigation, and scrollbars. Great for dashboards larger than your terminal. Also by @ronisbr.

  • Launcher overhaul — demos are now organized in a collapsible TreeView by category (Visual, Widgets, Data, Input, System, Test) with full mouse support.

  • Performance — lazy pixel framebuffer clear saves ~5MB/frame memset when you’re not using sixel graphics; ASCII fast path skips grapheme segmentation for normal text.

  • Windows resize fix — terminal size detection now works correctly after stdout redirect. Thanks @davidanthoff.

Full changelog: Release v2.0.1 · kahliburke/Tachikoma.jl · GitHub

6 Likes

That should probably be a 2.1 release, there are new features there.

2 Likes

Is that what you would prefer? I can do one easily.

1 Like

That’s how server works:

Semantic Versioning 2.0.0 | Semantic Versioning Semantic Versioning 2.0.0 | Semantic Versioning

2 Likes

Thank you for the helpful lesson.

1 Like

Tachikoma.jl v2.1.0 — Every frame, right on time

Hi everyone! Tachikoma.jl v2.1.0 is out with a bunch of fixes and improvements since the v2.0 launch.

Highlights:

  • Frame timing is back to rock-solid — restored deadline-based frame pacer that locks precisely to target FPS (60, 120, 240, whatever you throw at it). The v2.0 Timer+Channel mechanism introduced ~2ms jitter per frame; this release fixes it with cooperative sleep() that also keeps sixel rendering flicker-free.

  • Full Unicode grapheme support — zero-width combining marks (, ), CJK wide characters (你好), and precomposed glyphs now render correctly across all widgets: Paragraph, Table, TabBar, StatusBar, and the terminal emulator. Thanks to @ronisbr for the core Cell/Buffer work.

  • New WidgetScroll widget — wrap any widget in a scrollable 2D viewport with click-drag panning, scroll wheel, keyboard navigation, and scrollbars. Great for dashboards larger than your terminal. Also by @ronisbr.

  • Launcher overhaul — demos are now organized in a collapsible TreeView by category (Visual, Widgets, Data, Input, System, Test) with full mouse support.

  • Performance — lazy pixel framebuffer clear saves ~5MB/frame memset when you’re not using sixel graphics; ASCII fast path skips grapheme segmentation for normal text.

  • Windows resize fix — terminal size detection now works correctly after stdout redirect. Thanks @davidanthoff.

Full changelog: https://github.com/kahliburke/Tachikoma.jl/releases/tag/v2.1.0

5 Likes

It feels like one day I’m going to come back here and Tachikoma.jl will be competing with emacs for number of features and extensibility. Great work!

Looking forward to setting up some skills for building interactive ML training dashboards with Tachikoma. That’s my new favorite thing to do, just build a dedicated interface for visualization per project / experimental workflow.

5 Likes

We should talk about Kaimon.jl!

1 Like