Library / SDK
gansm/finalcut avatar
gansm/finalcut

FINAL CUT: a C++ widget toolkit for the terminal that needs no ncurses

A Modern C++ Text-Based Widget Toolkit (TUI)

1,208 stars62 forksC++LGPL-3.0

At a glance

What is it?
FINAL CUT is a C++ library for building text mode user interfaces with dialogs, buttons, list boxes and its own windowing system, and it deliberately avoids ncurses and termbox while keeping mouse support, UTF-8 and full width characters. It is LGPL-3.0, autotools based, and it draws through a virtual terminal layer rather than straight to the screen.
Who is it for?
Adopt FINAL CUT if you are writing a C++ terminal application and want a real widget set, dialogs, list boxes and mouse handling without pulling ncurses into your dependency graph, and if you like a self contained windowing model. Do not adopt it for a small script, since a text mode interface is a deliberate commitment, and do not expect the widget catalogue to match a desktop toolkit.
Can I use it commercially?
Yes, with conditions. LGPL-3.0 is a weak copyleft licence: you can use it inside commercial and closed-source software, but if you distribute changes to its own files, you must publish those changes under the same licence.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The bet: implement the terminal layer instead of linking one

FINAL CUT is a C++ library for creating terminal applications with text based widgets, and the positioning sentence in the README is the one worth quoting in substance: it is designed for simplicity and does not require the functionality of external libraries such as ncurses or termbox, but still offers full mouse support, Unicode compatibility and versatile widget functions. That is a real engineering bet rather than a slogan. A library that does its own terminal handling has to deal with terminfo style capability queries, escape sequences, cursor addressing, colour handling and resize events by itself, and it has to do it for every platform it claims to support. The payoff for the user is a dependency graph with one fewer project in it, a build that does not need the development headers of a system package, and behaviour that does not change because the system library was upgraded. The cost is that the library is responsible for a layer most other toolkits inherit for free, and the platform list, which is long, is essentially the list of terminals it has been made to work against.

A Qt shaped class structure with a conventional widget set

The class structure of FINAL CUT was inspired by the Qt framework, and the widgets it ships are the ones you would expect from a desktop toolkit: dialog boxes, push buttons, check boxes, radio buttons, input lines, list boxes and status bars. The examples directory makes the range concrete, with programs for a dialog, an input dialog, a list box, a list view, a menu, a checklist, a choice, an event log, an event loop, keyboard handling, mouse handling, a calculator, a 7-segment display, a Mandelbrot renderer, a cartesian graph, background colours, highlighted text, full width characters, a parallax scrolling view, a busy indicator and a hello world. The text handling is a separate concern and gets its own attention, because the library provides UTF-8 character encoding, full width character support and the ability to display combined Unicode characters, which is the combination that makes CJK text and emoji render correctly in a fixed width grid. The documentation index is a set of Markdown files under `doc/`, with an introduction as the entry point, a FAQ that also answers what you need in order to build the library, a page on mouse control with title bar actions on mouse clicks, a benchmark page, and an architecture diagram of the sub-systems of a FINAL CUT application.

The virtual terminal is the layer everything else sits on

The most interesting design decision in the library is not visible in the widget list, and the README describes it directly: FINAL CUT uses a virtual terminal to draw characters via an update method to the screen, it features an overlay of virtual windows to handle movement, and the update methods only transfer changes to the virtual terminal or the physical screen. The diagram in the README shows a program writing to a vwin window that lives inside a vterm, with the vterm created and restored around it. Read carefully, that is a double buffering model. The application does not paint into the terminal directly; it draws into a virtual window, the window is composited into the virtual terminal, and only the difference is written out. The practical consequences are the usual ones for a double buffered approach, and they are good: a redraw touches only the cells that changed, so a dialog that opens over a list does not repaint the list, and the movement of windows is handled in the virtual layer rather than by clever terminal tricks. It is also why the library can offer multiple text windows on the screen through its own windowing system, rather than by splitting the terminal into fixed regions the way a raw mode program has to.

Building it: autotools by hand, or the build script

The installation section starts with a pointer to the FAQ entry on what you need to build the library, which is the sensible place to look before you start, and then gives the manual sequence.

bash
git clone https://github.com/gansm/finalcut.git
cd finalcut
autoreconf --install --force
./configure --prefix=/usr
make
su -c "make install"

The project ships a shell script in the root called `build.sh` that the README recommends instead, and the note explains the trade: execute `./build.sh release` to initiate configuration and building, and run `./build.sh help` for the list of available options. Underneath, this is an autotools project, with `configure.ac`, `Makefile.am`, `autogen.sh` and a `finalcut.pc.in` template for pkg-config, so the install is a normal `make install` into a prefix you choose with `--prefix`. The CMake route exists too, through a `Findfinalcut.cmake` module for consumers. The examples have their own makefiles for several compilers, with a `Makefile.gcc`, a `Makefile.clang` and a `Makefile.am`, which tells you the examples are meant to be built and run, not just read.

Platform support is the long list, and the CI badges prove each entry

The supported platform list is Linux, FreeBSD, NetBSD, OpenBSD, macOS, Cygwin, GNU Hurd and Solaris, and the README adds that other platforms may still be compatible and invites contributions to extend the support. What makes this list credible rather than aspirational is the set of continuous integration badges in the README, one workflow per platform: ARM, FreeBSD, NetBSD, OpenBSD, macOS, Cygwin and Solaris, each with its own build badge. So the BSD family is not a token mention, and the ARM build is a separate job rather than an afterthought, which matters for the embedded and single board computers where a terminal application often ends up. The quality tooling around it is equally broad, with CodeQL analysis, a Coverity scan, a SonarCloud quality gate, CodeFactor, a SIGRID publish workflow and a codecov configuration, plus a `SECURITY.md` and a code of conduct. The repository also contains NewFont, a graphical text font for X11 and the Linux console, with its own screenshots showing a user interface in NewFont mode, so the library can be made to look like a graphical application rendered in text.

What the project does not give you

Two limits are worth naming before you commit. The first is scope: the widget set is a useful selection of desktop style controls, and it is not a complete toolkit, so a text mode application with rich data display, syntax highlighting or a tree view will need work beyond the built in widgets. The second is the version history, and it deserves attention because the numbers look odd. The tagged releases are 0.9.0 in May 2023, 0.8.0 in October 2021 and 0.9.1 in July 2024, while the last push to the branch was on 2026-10-14, so the source is being worked on steadily without a new tag for a long stretch. Nothing in the README explains the gap, and there is no release note stream in the repository root beyond a `ChangeLog` file, so if you are pinning a version for a product you should read the branch rather than assume the tag is current. The licence is LGPL-3.0, which is the last point to check before you link it, and the benchmark page is the place to see how the library performs against your terminal, since the Rotozoomer example is provided for exactly that check.

Editorial conclusion

Adopt FINAL CUT if you are writing a C++ terminal application and want a real widget set, dialogs, list boxes and mouse handling without pulling ncurses into your dependency graph, and if you like a self contained windowing model. Do not adopt it for a small script, since a text mode interface is a deliberate commitment, and do not expect the widget catalogue to match a desktop toolkit. Before you build, read the requirements in the FAQ, since the library talks to the terminal directly, and check that your platform is on the supported list of Linux, the BSDs, macOS, Cygwin, GNU Hurd and Solaris. The licence is LGPL-3.0, the newest release is 0.9.1 from 2024-07-27, and the last push was on 2026-10-14.

Frequently asked questions

Does FINAL CUT need ncurses or termbox?

No. The README says FINAL CUT does not require the functionality of external libraries such as ncurses or termbox, while still offering full mouse support, Unicode compatibility and versatile widget functions. It implements its own terminal handling and virtual terminal layer.

How do I build and install FINAL CUT?

Clone the repository, run `autoreconf --install --force`, then `./configure --prefix=/usr`, `make` and `su -c "make install"`. The README recommends the bundled `build.sh` instead: run `./build.sh release`, and use `./build.sh help` to see the available options.

Which platforms does FINAL CUT support?

Linux, FreeBSD, NetBSD, OpenBSD, macOS, Cygwin, GNU Hurd and Solaris, and the README notes other platforms may still be compatible and welcomes contributions to extend support. There is a separate continuous integration workflow for each listed platform, including an ARM build.

What widgets does FINAL CUT provide?

Dialog boxes, push buttons, check boxes, radio buttons, input lines, list boxes and status bars, with a class structure inspired by the Qt framework. The examples directory adds a file dialog with incremental search, a progress bar, a text view, a menu, a calculator and a Mandelbrot renderer.

What licence is FINAL CUT released under?

LGPL-3.0, with the COPYING and LICENSE files in the repository root. The latest tagged release is 0.9.1 from 2024-07-27, while the last push to the branch was on 2026-10-14.

Official sources

  1. gansm/finalcut on GitHub
  2. License: LGPL-3.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/gansm-finalcut.svg)](https://hysenlabs.com/projects/gansm-finalcut)

Was this useful?