jesseduffield.lazygit/pkg/gocui
Stefan Haller 873804a37b Make Gui.Update a synchronous FIFO enqueue
Update spawned a goroutine per call that then sent on the user-events
channel, so multiple Update calls from the same goroutine could be
reordered by the scheduler — the doc comment even admitted "the order in
which the user events will be handled is not guaranteed." That
non-determinism is a latent source of flaky rendering: code that queues a
model update and then a render in source order could see them run in the
opposite order.

Send on the channel directly instead, so same-goroutine calls arrive in
source order. The send is non-blocking and panics on a full channel
rather than blocking (a blocked send from the UI goroutine would deadlock
against itself) or silently reordering; the buffer is sized generously so
this is unreachable in normal use. UpdateAsync is now identical to Update
and unused, so it's removed along with the shared updateAsyncAux helper.
2026-07-02 17:32:01 +02:00
..
attribute.go Bump tcell dependency to v3 2026-04-30 22:14:26 +02:00
AUTHORS Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
CHANGES_tcell.md Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
CODE_OF_CONDUCT.md Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
CONTRIBUTING.md Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
doc.go Remove dead Modifier field from keybindings 2026-05-06 09:51:23 +02:00
edit.go Convert keybinding fields to Keybinding 2026-05-25 15:32:47 +02:00
escape.go Stop leaking other malformed and unimplemented escape sequences 2026-06-30 09:20:15 +02:00
escape_test.go Stop leaking other malformed and unimplemented escape sequences 2026-06-30 09:20:15 +02:00
flush_test.go When drawing tainted views in ForceFlushViewsContentOnly, also draw views that overlap them 2026-05-09 13:58:33 +02:00
gui.go Make Gui.Update a synchronous FIFO enqueue 2026-07-02 17:32:01 +02:00
gui_others.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
gui_windows.go Fix linter warnings 2026-04-30 14:29:08 +02:00
key.go Move modifiers into Key 2026-04-30 22:22:53 +02:00
keybinding.go Remove dead Modifier field from keybindings 2026-05-06 09:51:23 +02:00
LICENSE Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
README.md Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
scrollbar.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
scrollbar_test.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
task.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
task_manager.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
tcell_driver.go Let integration tests post a focus event 2026-06-23 14:15:18 +02:00
text_area.go Add a forwardDeleteWord keybinding 2026-04-30 22:31:44 +02:00
text_area_test.go Fix linter warnings 2026-04-30 14:29:08 +02:00
view.go Extend the fill background to wrapped tail segments 2026-06-18 17:22:31 +02:00
view_test.go Extend the fill background to wrapped tail segments 2026-06-18 17:22:31 +02:00

GOCUI - Go Console User Interface

CircleCI CodeCov Go Report Card GolangCI GoDoc GitHub tag (latest SemVer)

Minimalist Go package aimed at creating Console User Interfaces. A community fork based on the amazing work of jroimartin

Features

  • Minimalist API.
  • Views (the "windows" in the GUI) implement the interface io.ReadWriter.
  • Support for overlapping views.
  • The GUI can be modified at runtime (concurrent-safe).
  • Global and view-level keybindings.
  • Mouse support.
  • Colored text.
  • Customizable editing mode.
  • Easy to build reusable widgets, complex layouts...

About fork

This fork has many improvements over the original work from jroimartin.

  • Written ontop of TCell
  • Better wide character support
  • Support for 1 Line height views
  • Better support for running in docker container
  • Customize frame colors
  • Improved code comments and quality
  • Many small improvements
  • Change Visibility of views

For information about this org see: awesome-gocui/about.

Installation

Execute:

$ go get github.com/awesome-gocui/gocui

Documentation

Execute:

$ go doc github.com/awesome-gocui/gocui

Or visit godoc.org to read it online.

Example

See the _example folder for more examples

package main

import (
	"fmt"
	"log"

	"github.com/awesome-gocui/gocui"
)

func main() {
	g, err := gocui.NewGui(gocui.OutputNormal, true)
	if err != nil {
		log.Panicln(err)
	}
	defer g.Close()

	g.SetManagerFunc(layout)

	if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
		log.Panicln(err)
	}

	if err := g.MainLoop(); err != nil && !gocui.IsQuit(err) {
		log.Panicln(err)
	}
}

func layout(g *gocui.Gui) error {
	maxX, maxY := g.Size()
	if v, err := g.SetView("hello", maxX/2-7, maxY/2, maxX/2+7, maxY/2+2, 0); err != nil {
		if !gocui.IsUnknownView(err) {
			return err
		}

		if _, err := g.SetCurrentView("hello"); err != nil {
			return err
		}

		fmt.Fprintln(v, "Hello world!")
	}

	return nil
}

func quit(g *gocui.Gui, v *gocui.View) error {
	return gocui.ErrQuit
}

Screenshots

r2cui

_examples/demo.go

_examples/dynamic.go

Projects using gocui

  • komanda-cli: IRC Client For Developers.
  • vuls: Agentless vulnerability scanner for Linux/FreeBSD.
  • wuzz: Interactive cli tool for HTTP inspection.
  • httplab: Interactive web server.
  • domainr: Tool that checks the availability of domains based on keywords.
  • gotime: Time tracker for projects and tasks.
  • claws: Interactive command line client for testing websockets.
  • terminews: Terminal based RSS reader.
  • diagram: Tool to convert ascii arts into hand drawn diagrams.
  • pody: CLI app to manage Pods in a Kubernetes cluster.
  • kubexp: Kubernetes client.
  • kcli: Tool for inspecting kafka topics/partitions/messages.
  • fac: git merge conflict resolver
  • jsonui: Interactive JSON explorer for your terminal.
  • cointop: Interactive terminal based UI application for tracking cryptocurrencies.
  • lazygit: simple terminal UI for git commands.
  • lazydocker: The lazier way to manage everything docker.

Note: if your project is not listed here, let us know! :)