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

**URL:** https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878
**Category:** Package Announcements
**Tags:** announcement, terminal, tooling
**Created:** [February 27, 2026, 3:37am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878 "2026-02-27T03:37:39Z")
**Posts on this page:** 20
**Page:** 5

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 20, 2026, 3:10am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/92 "2026-03-20T03:10:47Z")

</div>

Well gang, there’s always room for improvement, so here’s a little version bump for you tab lovers:

## Tachikoma.jl v1.1.5
We gave TabBar a brain.

Turns out widgets work better when they can think for themselves. Keys, mouse, overflow. Backwards compatible, opt in for more automatic input handling.

Release notes: [Release v1.1.5 · kahliburke/Tachikoma.jl · GitHub](https://github.com/kahliburke/Tachikoma.jl/releases/tag/v1.1.5)

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 25, 2026, 8:40am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/93 "2026-03-25T08:40:21Z")

</div>

# Tachikoma.jl v2.0 — Full RGBA pixel pipeline, widget styling system, sixel compositor

_The think tanks have been upgraded - 100% more alpha channel._

Tachikoma.jl v2.0 is out! This is a major release that reworks the pixel rendering pipeline and introduces a type-safe widget styling system.

## Why v2.0?

Three breaking changes that couldn’t be done incrementally:

**RGBA everywhere.** The pixel pipeline previously used `ColorRGB` with a background sentinel to represent transparency — fragile and error-prone. v2.0 uses `ColorRGBA` throughout. Transparency lives in the alpha channel where it belongs. The `bg` parameter is gone from every encoder.

**Widget styling via type dispatch.** TabBar and Button used a growing list of kwargs that was becoming unwieldy. v2.0 replaces this with type-parameterized decorations:

```julia
TabBar(labels; tab_style=TabBarStyle(decoration=BoxTabs(box=BOX_HEAVY)))
Button("Submit"; button_style=ButtonStyle(decoration=BorderedButton()))

```

Subtype `TabDecoration` or `ButtonDecoration` to create custom looks. Old kwargs removed — clean break.

More widgets will be reworked with additional styling in the future, but this should not require any breaking changes to the API.

**FloatingWindow `on_render`** gains a `frame` parameter, enabling pixel graphics inside floating windows.

## Sixel Virtual Framebuffer

Multiple `render_rgba!` calls per frame are alpha-composited into a shared framebuffer. A text mask algorithm splits sixel output into rectangles that avoid covering terminal text — so Makie plots in floating windows can have visible titles. Previously impossible with sixel.

The same type system is built in natively for terminals compatible with the kitty gfx protocol.

If you’re not using one of these terminals that support these features, well go get one of them, you’re missing out! Windows users should specifically check out the kitty support in recent versions of VSCode.

## Other Highlights

- **ColorTypes.jl extension** — seamless `to_rgb`/`to_colortype` conversion for Makie/Colors.jl interop. Auto-activates, zero cost if unused.
- **Env-based graphics detection** — auto-detect kitty/sixel from environment variables. Faster startup, works on remote TTY. Supports kitty, Ghostty, WezTerm, iTerm2, foot, mlterm.
- **24 built-in themes** — 11 dark + 13 light with `set_light_mode!()`.
- **Button flash customization** — custom `flash_style` function and `flash_frames` duration (thanks @ronisbr!).
- **Cursor fix for light themes** — theme-aware colors instead of hardcoded black/white (thanks @eschnett!).

[Release notes here](https://github.com/kahliburke/Tachikoma.jl/releases/tag/v2.0.0).

Feedback and issues welcome!

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 25, 2026, 8:46am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/94 "2026-03-25T08:46:03Z")

</div>

As an example of the functionality the new RGBA system allows, this is possible in Sixel now. In the attached demo I’m using a new Makie.jl backend that’s a work in progress. Keep an eye out for it soon – TachiMakie.jl.

It’s also possible and pretty straightforward to connect the pixels generated by GLMakie to the pixel rendering support as @Ronis_BR has done with his very cool satellite sim system described in this topic - [INPE's satellite simulator UI is now powered by Tachikoma.jl, and it is amazing! - #2 by Ronis\_BR](https://discourse.julialang.org/t/inpes-satellite-simulator-ui-is-now-powered-by-tachikoma-jl-and-it-is-amazing/136342/2)

---

<div class="post-metadata">

### Author: ![vancleve](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vancleve/32/4183_2.png) [@vancleve](https://discourse.julialang.org/u/vancleve)
#### Post date: [March 25, 2026, 6:43pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/95 "2026-03-25T18:43:19Z")

</div>

Wow, looks like some awesome features!

> [@kahliburke](#):
>
> The same type system is built in natively for terminals compatible with the kitty gfx protocol.
> 
> If you’re not using one of these terminals that support these features, well go get one of them, you’re missing out! Windows users should specifically check out the kitty support in recent versions of VSCode.

I’m unfortunately (?) a long-time user of iTerm on macOS; which terminals on macOS would you recommend that support this?

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 25, 2026, 6:44pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/96 "2026-03-25T18:44:54Z")

</div>

I use iTerm2 all the time. Also kitty and ghostly are good. I just meant if you were on Windows mainly. Also the standard Apple Terminal.app is not great.

The video animation I posted above was done in iTerm2.

---

<div class="post-metadata">

### Author: ![DoktorMike](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/doktormike/32/2736_2.png) [@DoktorMike](https://discourse.julialang.org/u/DoktorMike)
#### Post date: [March 25, 2026, 7:00pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/97 "2026-03-25T19:00:04Z")

</div>

Fantastic work. Looking forward to playing around with it. 😊

---

<div class="post-metadata">

### Author: ![Ronis\_BR](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ronis_br/32/50999_2.png) [@Ronis\_BR](https://discourse.julialang.org/u/Ronis_BR)
#### Post date: [March 25, 2026, 7:05pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/98 "2026-03-25T19:05:15Z")

</div>

> [@vancleve](#):
>
> I’m unfortunately (?) a long-time user of iTerm on macOS; which terminals on macOS would you recommend that support this?

I have been using Tachikoma.jl in ghostty and the experience is just amazing! Ghostty is a little faster than Kitty in macOS probably due to the Metal integration.

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 25, 2026, 8:15pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/99 "2026-03-25T20:15:18Z")

</div>

@Ronis_BR has been sending fun requests my way, a little earlier today he asked if there was a way to have a sort of virtual terminal space that would extend beyond the bounds of the displayed characters. While Tachi already had `ScrollPane` for scrollable text content, he said he wanted to be able to do this with arbitrary widgets.

Well it only took about 130 lines of code to create a new widget type which allows embedding arbitrary widgets inside of a virtual terminal space with mouse support for panning inside. Check it out!  
 ![scroll_demo](https://global.discourse-cdn.com/julialang/original/3X/1/2/1281745623fe42d3a1621a912646d47552302d26.gif)

---

<div class="post-metadata">

### Author: ![devel-chm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devel-chm/32/3572_2.png) [@devel-chm](https://discourse.julialang.org/u/devel-chm)
#### Post date: [March 25, 2026, 8:55pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/100 "2026-03-25T20:55:46Z")

</div>

The instructions for using the `demos/Tachikoma` do not work on win11.

```julia-auto
using Pkg
Pkg.activate("demos/TachikomaDemos")
Pkg.instantiate()

using TachikomaDemos
launcher() # interactive menu

```

When I run those commands at [https://github.com/kahliburke/Tachikoma.jl#demos](https://github.com/kahliburke/Tachikoma.jl#demos)  
from the win11 REPL for julia LTS (1.10.9), I get the following:

```julia-auto
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.
Stacktrace:
 [1] macro expansion
   @ .\loading.jl:1842 [inlined]
 [2] macro expansion
   @ .\lock.jl:267 [inlined]
 [3] __require(into::Module, mod::Symbol)
   @ Base .\loading.jl:1823
 [4] #invoke_in_world#3
   @ .\essentials.jl:926 [inlined]
 [5] invoke_in_world
   @ .\essentials.jl:923 [inlined]
 [6] require(into::Module, mod::Symbol)
   @ Base .\loading.jl:1816

```

It seems a little odd that you don’t need a specific directory to use  
the `activate` call.

---

<div class="post-metadata">

### Author: ![Ronis\_BR](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ronis_br/32/50999_2.png) [@Ronis\_BR](https://discourse.julialang.org/u/Ronis_BR)
#### Post date: [March 25, 2026, 11:01pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/101 "2026-03-25T23:01:41Z")

</div>

This was amazing! I tried here and it is so smooth. I remember that I faced so many problems to design something similar in TextUserInterfaces.jl with NCurses.jl.

Thank you very much @kahliburke !!

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 26, 2026, 3:18am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/102 "2026-03-26T03:18:02Z")

</div>

> [@devel-chm](#):
>
> The instructions for using the `demos/Tachikoma` do not work on win11.

It looks like it might be something related to the way paths, directories are handled but if you are able to activate the project at the correct location, the demos should function.

Honestly Windows is a bit of a sore spot for this project. I have put some effort into making it functional, at least modestly so, on Windows. However it’s not my development environment and I haven’t had a good testing setup for digging into issues. I have tested and seen Tachikoma work on Windows, so I know it’s not a lost cause.

One issue with Windows is that the terminal support is generally far behind the Unix world and many of the things I want to do with this framework depend on the modern capabilities of terminal applications like iTerm2, kitty, ghostty, Wezterm, etc. There just isn’t the support for some of the more advanced features out of the box on Windows.

If you’d like to assist me in improving the Windows support, I would of course love it to run great as widely as possible, but I honestly could use the help. I’ve been responsive to bug reports and PRs on GitHub, please file an issue, submit a PR, contact me here in chat, etc. if you want to use this and are willing to invest the time. Regardless thank you for the feedback, I look at every issue mentioned.

---

<div class="post-metadata">

### Author: ![ffevotte](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ffevotte/32/6587_2.png) [@ffevotte](https://discourse.julialang.org/u/ffevotte)
#### Post date: [March 26, 2026, 7:49am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/103 "2026-03-26T07:49:43Z")

</div>

> [@devel-chm](#):
>
> ```julia-auto
> julia> Pkg.activate("demos/TachikomaDemos")
> Activating new project at `C:\Users\me\demos\TachikomaDemos`
> 
> ```

I think “new project” here indicates that nothing was found at the given path. Maybe it should be something like `Tachikoma/demos/TachikomaDemos` (or you’d need to `cd` to the root of the `Tachikoma` project before issuing your command).

---

<div class="post-metadata">

### Author: ![sijo](https://avatars.discourse-cdn.com/v4/letter/s/da6949/32.png) [@sijo](https://discourse.julialang.org/u/sijo)
#### Post date: [March 26, 2026, 8:04am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/104 "2026-03-26T08:04:32Z")

</div>

First window management and now panning? I was going to say “guys, we already have window managers/compositors, you’re not going to beat that” but I suppose it could be useful to provide a GUI over ssh 🙂

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 26, 2026, 8:08am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/105 "2026-03-26T08:08:29Z")

</div>

> [@sijo](#):
>
> useful to provide a GUI over ssh

Also, it can be really useful to have terminal UIs up when you’re spending a lot of time primarily in IDEs like VSCode, or Emacs. There is also a very interesting intersection of these primarily text based UIs with the agentic AI coding assistants. Because the UI itself is in the natural representation system of these tools, I am finding them to be very good at constructing UIs for a variety of purposes. I have several projects in the works at the moment that are built on top of Tachi and it’s proving to be, for me at any rate, a productive experience.

---

<div class="post-metadata">

### Author: ![ffevotte](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ffevotte/32/6587_2.png) [@ffevotte](https://discourse.julialang.org/u/ffevotte)
#### Post date: [March 26, 2026, 9:10am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/106 "2026-03-26T09:10:01Z")

</div>

> [@kahliburke](#):
>
> or Emacs

Yes that would probably be the primary use case I would envision for Tachikoma for my workflow. BTW I’ve started testing Tachikoma in Emacs, and my first impression (based on demos) is that vterm seems to be useable (although not as fast as e.g. kitty).

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 26, 2026, 9:11am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/107 "2026-03-26T09:11:16Z")

</div>

> [@ffevotte](#):
>
> first impression (based on demos) is that vterm seems to be useable (although not as fast as e.g. kitty).

That’s good to learn, thanks! I haven’t tested there at all. Do any of the pixel graphics demos function?

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 26, 2026, 9:12am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/108 "2026-03-26T09:12:28Z")

</div>

> [@ffevotte](#):
>
> I think “new project” here indicates that nothing was found at the given path. Maybe it should be something like `Tachikoma/demos/TachikomaDemos` (or you’d need to `cd` to the root of the `Tachikoma` project before issuing your command).

I think there might be a difference in behavior between Julia 1.10 and 1.12 here? Hoping that you were able to navigate through that?

---

<div class="post-metadata">

### Author: ![ffevotte](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ffevotte/32/6587_2.png) [@ffevotte](https://discourse.julialang.org/u/ffevotte)
#### Post date: [March 26, 2026, 9:19am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/109 "2026-03-26T09:19:02Z")

</div>

> [@kahliburke](#):
>
> Do any of the pixel graphics demos function?

Not sure exactly what you refer to here…

The “Chart” demo works well if that’s what you mean. I can try to run another demo and report back here if there is anything specific you’d like me to try.

---

<div class="post-metadata">

### Author: ![magister-ludi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/magister-ludi/32/4003_2.png) [@magister-ludi](https://discourse.julialang.org/u/magister-ludi)
#### Post date: [March 26, 2026, 11:53am UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/110 "2026-03-26T11:53:32Z")

</div>

> [@kahliburke](#):
>
> Honestly Windows is a bit of a sore spot for this project. I have put some effort into making it functional, at least modestly so, on Windows. However it’s not my development environment and I haven’t had a good testing setup for digging into issues. I have tested and seen Tachikoma work on Windows, so I know it’s not a lost cause.

I agree that the instructions break on Win11. TBH, that’s fairly easy to work around. Happy to provide further input if requested.

However, there are also problems with event handling on Win11. Running demos using both WezTerm and Windows Terminal, some events are not captured properly:

1. Mouse events are not captured at all.
2. Function keys 1 to 5 are not captured correctly
3. Ctrl-? input is not correctly handled, e.g.: `Ctrl-M` is interpreted as Char(13), i.e. as `:return`

Running demos in a WSL (openSUSE-Leap-16.0) instance (in Windows Terminal) works exactly as expected.

I’d be happy to contribute to discovering ways to deal with this.

---

<div class="post-metadata">

### Author: ![kahliburke](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kahliburke/32/208472_2.png) [@kahliburke](https://discourse.julialang.org/u/kahliburke)
#### Post date: [March 26, 2026, 2:15pm UTC](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878/111 "2026-03-26T14:15:57Z")

</div>

> [@magister-ludi](#):
>
> However, there are also problems with event handling on Win11.

I’m not surprised, like I said, I haven’t had the testing environment to really dig into it. If you’re interested in improving compatibility here, I’m certainly open to the help. As for input testing, I have a testing helper script which I used, alongside Claude code, to help work out some of these terminal related nuances in the Mac/linux space. I’ll ping you on chat about it.

[Previous page](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878.md?page=4)

[Next page](https://discourse.julialang.org/t/ann-tachikoma-jl-a-terminal-ui-framework-for-julia/135878.md?page=6)
