# ZigZag - A TUI framework for Zig

**URL:** <https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226>\
**Category:** Showcase\
**Tags:** standard-library, tui, llm\
**Created:** [February 7, 2026, 10:49am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226 "2026-02-07T10:49:56Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [February 7, 2026, 10:49am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/1 "2026-02-07T10:49:56Z")

</div>

Hey everyone! I just released v0.1.0 of ZigZag, a TUI framework inspired by Go’s Bubble Tea and Lipgloss.

I built this because I wanted a nice way to build terminal UIs in Zig without reaching for C libraries or bindings.

Features:

- Elm-inspired architecture (Model-View-Update)

- Flexbox-like layouts

- Styling (colors, borders, padding, etc.)

- Input handling

Repo: [https://github.com/meszmate/zigzag](https://github.com/meszmate/zigzag)

Still early days, feedback and contributions welcome!

---

<div class="post-metadata">

**Author:** ![kitajusSus](https://ziggit.dev/user_avatar/ziggit.dev/kitajussus/32/4169_2.png) [@kitajusSus](https://ziggit.dev/u/kitajusSus)\
**Post date:** [February 7, 2026, 1:11pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/2 "2026-02-07T13:11:27Z")

</div>

Are you going to update the project or its just as it is right now? Update I mean by updating to the newest zig 0.16.0 in the future.

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [February 7, 2026, 1:23pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/3 "2026-02-07T13:23:42Z")

</div>

Yep, actively maintained! I’ll keep it updated with new Zig releases.

---

<div class="post-metadata">

**Author:** ![vallino](https://ziggit.dev/user_avatar/ziggit.dev/vallino/32/7495_2.png) [@vallino](https://ziggit.dev/u/vallino)\
**Post date:** [February 7, 2026, 3:57pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/4 "2026-02-07T15:57:35Z")

</div>

Elm thinking is great

---

<div class="post-metadata">

**Author:** ![jzp](https://ziggit.dev/user_avatar/ziggit.dev/jzp/32/7490_2.png) [@jzp](https://ziggit.dev/u/jzp)\
**Post date:** [February 7, 2026, 7:28pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/5 "2026-02-07T19:28:45Z")

</div>

This is really cool! I’ve been on the lookout for something like this.

---

<div class="post-metadata">

**Author:** ![ForeverZer0](https://ziggit.dev/user_avatar/ziggit.dev/foreverzer0/32/2443_2.png) [@ForeverZer0](https://ziggit.dev/u/ForeverZer0)\
**Post date:** [February 7, 2026, 7:44pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/6 "2026-02-07T19:44:56Z")

</div>

Awesome project, I look forward to using it.

---

<div class="post-metadata">

**Author:** ![fdik](https://ziggit.dev/user_avatar/ziggit.dev/fdik/32/7517_2.png) [@fdik](https://ziggit.dev/u/fdik)\
**Post date:** [February 7, 2026, 7:56pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/7 "2026-02-07T19:56:12Z")

</div>

How lovely is this! Impressed.

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [February 11, 2026, 4:39pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/8 "2026-02-11T16:39:49Z")

</div>

> **[Release v0.1.1 · meszmate/zigzag](https://github.com/meszmate/zigzag/releases/tag/v0.1.1)**
>
> What's Changed
> 
> Github actions CI by @meszmate in #1
> Fix/terminal state restore on exit by @meszmate in #3
> Custom event loop support by @meszmate in #6
> Add unicode support; Unicode tab in showcase ...

First patch release! Mostly focused on fixes and laying groundwork.

**What’s new:**

- Custom event loop support: you can now bring your own event loop instead of relying on the built-in one

- Unicode support (+ a unicode tab in the showcase to play with)

**Fixes:**

- Windows compilation is working now

- Terminal state properly restores on exit (no more messed up terminals)

---

<div class="post-metadata">

**Author:** ![MinervasRefuge](https://ziggit.dev/user_avatar/ziggit.dev/minervasrefuge/32/7304_2.png) [@MinervasRefuge](https://ziggit.dev/u/MinervasRefuge)\
**Post date:** [February 12, 2026, 1:49am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/9 "2026-02-12T01:49:43Z")

</div>

I’ve been looking though the code, has AI been used in this project?

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [February 12, 2026, 3:49am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/10 "2026-02-12T03:49:07Z")

</div>

Yeah, used AI for parts of it.

---

<div class="post-metadata">

**Author:** ![tgirod](https://ziggit.dev/user_avatar/ziggit.dev/tgirod/32/3744_2.png) [@tgirod](https://ziggit.dev/u/tgirod)\
**Post date:** [February 12, 2026, 4:46pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/11 "2026-02-12T16:46:04Z")

</div>

Hey! I’ve been using bubbletea a lot, and the similarity makes me wonder if you started this project by asking a LLM to translate bubbletea to zig. Is it the case ? If so, did you test extensively the resulting code ?

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [February 13, 2026, 8:04am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/12 "2026-02-13T08:04:53Z")

</div>

Bubbletea was a big inspiration for the architecture, yeah. I used LLMs as a tool during development like I do with most projects nowadays, but it’s not a translation. Zig requires a very different approach to memory management, error handling, etc. And yes, everything is tested and properly maintained.

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [March 9, 2026, 3:52pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/13 "2026-03-09T15:52:39Z")

</div>

ZigZag v0.1.2 released: chart components, inline image support, overlays, focus management, and Windows fixes

zigzag v0.1.2 has been released.

This update adds a few larger pieces to the UI layer: charting support, canvas drawing, inline terminal images, focus management, modal/tooltip overlays, tab groups, and OSC 52 clipboard support. It also includes a number of fixes around text input, layout, cursor rendering, frame timing, and Windows event handling.

Included in v0.1.2:

- Added parentheses around struct literals. (#10)

- Fixed a memory leak in the todo\_list example. (#14)

- Fixed the layout issue in example showcase tab five. (#15)

- Fixed Chinese input handling in TextArea and TextInput. (#16)

- Fixed text editor cursor display. (#18)

- Fixed the Windows readInput blocking call that disabled ticking. (#22)

- Added soft word wrap to TextArea. (#23)

- Fixed a nil pointer dereference when using ctx.allocator in init. (#26)

- Drained non-byte console events to unblock the initial tick on Windows. (#27)

- Fixed missing placeholder padding and empty row padding in TextArea. (#30)

- Fixed an extra newline in inline styles. (#31)

- Fixed frame timings and non-monotonic clock issues. (#34)

- Added inline image support for Kitty, iTerm2, and Sixel. (#35)

- Extended image support with caching, in-memory data, z-index, and protocol selection. (#36)

- Added a focus management system with customizable key bindings. (#37)

- Added Modal and Tooltip overlay components. (#38)

- Added TabGroup for multi-screen tab navigation. (#39)

- Added OSC 52 clipboard support for copy and query. (#40)

- Added Chart, BarChart, and Canvas components, and enhanced Viewport. (#41)

- Improved responsive chart layout. (#42)

Contributors in this release: nwindian, dacec354 and me

 ![charts](https://ziggit.dev/uploads/default/original/2X/1/1abcc97b2a2f3c1700a3729b1ac49c6366bce23d.jpeg)

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [April 28, 2026, 8:23am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/14 "2026-04-28T08:23:29Z")

</div>

Hey folks,

Just shipped v0.1.3 of [ZigZag](https://github.com/meszmate/zigzag), my Elm-architecture TUI framework for Zig (inspired by Bubble Tea / Lipgloss). This release got pretty big, here’s what’s new since v0.1.2:

**18 new components**

- Input/forms: Form, Dropdown, Checkbox/RadioGroup, Slider, MenuBar, ContextMenu

- Data: SortableTable (column sort + filter), DataTable (cell-cursor, frozen columns), VirtualList (lazy rendering for 100K+ items)

- Visualization: Gauge, Heatmap, Calendar/DatePicker, BrailleCanvas (pixel-grid drawing)

- Content: Markdown renderer, CodeView (syntax highlighting), DiffView (unified + side-by-side), RichLog (append-only log panes)

**New systems**

- Theming with built-in palettes + `ThemeManager`

- Animation system (easing + tweens)

- Constraint-based Flexbox layout engine

- Layer compositing with z-ordering

- `SubProgram` for nested Model-Update-View composition

- `AsyncRunner` for background tasks

- `ScreenStack` router for push/pop navigation

- Accessibility module (WCAG contrast + roles)

- WASM platform backend — you can target the browser now

- DevConsole log streamer (file/tcp/stderr sinks)

- Mouse hit-testing utilities

- Text overflow policies (hidden, ellipsis, word\_wrap, char\_wrap)

**Fixes & polish**

- Memory leaks in file\_browser, modal, toast

- `word_wrap` crash from unsigned integer underflow

- Form submit on Ctrl+S works across terminals

- Full customizability for every component

- Writergate compatibility (thanks Cohors1316!)

Pinned to Zig 0.15.2. Zero deps, pure Zig.

Release notes: [https://github.com/meszmate/zigzag/releases/tag/v0.1.3](https://github.com/meszmate/zigzag/releases/tag/v0.1.3)

Feedback welcome, especially curious what people want to see next.

---

<div class="post-metadata">

**Author:** ![WeeBull](https://ziggit.dev/user_avatar/ziggit.dev/weebull/32/6828_2.png) [@WeeBull](https://ziggit.dev/u/WeeBull)\
**Post date:** [April 28, 2026, 9:16am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/15 "2026-04-28T09:16:23Z")

</div>

> [@meszmate](#):
>
> Pinned to Zig 0.15.2

Do you intend to move to 0.16.x? I expect it’s quite a bit of work, no?

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [April 28, 2026, 9:43am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/16 "2026-04-28T09:43:19Z")

</div>

Yep, working on it. Want to get it right rather than rush, so probably the next release.

---

<div class="post-metadata">

**Author:** ![meszmate](https://ziggit.dev/user_avatar/ziggit.dev/meszmate/32/7801_2.png) [@meszmate](https://ziggit.dev/u/meszmate)\
**Post date:** [May 6, 2026, 11:19am UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/17 "2026-05-06T11:19:42Z")

</div>

ZigZag v0.1.5 is out.

The main thing in this release is full Zig 0.16+ compatibility. The stdlib changes in 0.16 (new Io, new Writer/format signature) broke a lot, so the framework and all the examples have been updated.

Also in this release:

- Comptime color and border values (thanks Cohors1316)
- Shift+Enter detection now works inside integrated terminals
- MouseEvent formatter updated to the new Writer signature

Big thanks to IridescentRose for doing most of the work on the 0.16 port.

Repo: [GitHub - meszmate/zigzag: A delightful TUI framework for Zig · GitHub](https://github.com/meszmate/zigzag) Release notes: [Release Zig 0.16+ Compatibility · meszmate/zigzag · GitHub](https://github.com/meszmate/zigzag/releases/tag/v0.1.5)

Feedback and issues welcome.

---

<div class="post-metadata">

**Author:** ![Sze](https://ziggit.dev/user_avatar/ziggit.dev/sze/32/496_2.png) [@Sze](https://ziggit.dev/u/Sze)\
**Post date:** [May 6, 2026, 2:32pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/18 "2026-05-06T14:32:25Z")

</div>

I find this alternating empty line style pretty terrible to read I would rather have a set of actual paragraphs instead.

---

<div class="post-metadata">

**Author:** ![lukeflo](https://ziggit.dev/user_avatar/ziggit.dev/lukeflo/32/7514_2.png) [@lukeflo](https://ziggit.dev/u/lukeflo)\
**Post date:** [May 6, 2026, 2:57pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/19 "2026-05-06T14:57:34Z")

</div>

Markdown headings and ill formatted line breaks in a post always carry the smell of written by some other tool, but i might be wrong…

---

<div class="post-metadata">

**Author:** ![pfech](https://ziggit.dev/user_avatar/ziggit.dev/pfech/32/461_2.png) [@pfech](https://ziggit.dev/u/pfech)\
**Post date:** [May 6, 2026, 3:47pm UTC](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226/20 "2026-05-06T15:47:13Z")

</div>

OP has already claimed AI usage at least in parts of the code, so why throw further hostility at him?

[Next page](https://ziggit.dev/t/zigzag-a-tui-framework-for-zig/14226.md?page=2)
