Self-hosted service
dankamongmen/notcurses avatar
dankamongmen/notcurses

Notcurses: assume the maximum terminal, step down when it complains

blingful character graphics/TUI library. definitely not curses.

4,723 stars164 forksCNOASSERTION

At a glance

What is it?
Notcurses is a C library for complex, graphics-heavy TUIs on modern terminal emulators, with vivid color, multimedia, threads and full Unicode, explicitly not a source-compatible X/Open Curses implementation or an NCURSES replacement. It is Apache2 licensed in its entirety, its nccell API is built on Unicode Extended Grapheme Clusters, and it renders bitmapped graphics through Sixel, Kitty and the Linux framebuffer.
Who is it for?
Choose Notcurses when the target is a modern terminal emulator on a workstation, laptop, phone or tablet and the interface wants images, video, sprites or saturated color that NCURSES was never designed around, or when thread safety and parallel use are core requirements. Stay with NCURSES when the target is industrial or retail hardware, critical applications, or maximum portability and time tested reliability, the project itself directs you there for those cases.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 135 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 September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Assume the maximum, step down when necessary

The design philosophy is stated as a direct inversion of Curses. Curses assumes the minimum terminal and allows you, with effort, to step up, whereas Notcurses assumes the maximum and steps down by itself when necessary. The author concedes this probably breaks on some older hardware, and counters that the Curses approach results in new software looking like old hardware. The intended audience is the interactive user on workstations, phones, laptops and tablets, possibly at the expense of some industrial and retail terminals. The README describes the result as a library facilitating complex TUIs on modern terminal emulators, supporting vivid colors, multimedia, threads and Unicode to the maximum degree possible, claims things can be done with Notcurses that simply cannot be done with NCURSES, and asserts, in the author's own unpolished words, that it is fast as shit.

Not a Curses replacement, but a terminfo customer

The relationship to NCURSES is spelled out twice so nobody misses it. Notcurses is not a source-compatible X/Open Curses implementation, and not a replacement for NCURSES on existing systems, having abandoned the X/Open Curses API bundled as part of the Single UNIX Specification. It is not a drop-in substitute in any sense. At the same time, wherever possible Notcurses makes use of the Terminfo library shipped with NCURSES, benefiting greatly from its portability and thoroughness, so the dependency runs one way, Notcurses consumes terminfo but exposes none of the Curses surface. For background on the older world, the README points to Thomas E. Dickey's authoritative NCURSES FAQ, and for licensing contrast it describes the NCURSES license, summarized as a restatement of MIT-X11, as drama in several acts, while Notcurses is Apache2-licensed in its entirety.

nccell on Extended Grapheme Clusters, color at 24 bits

Text handling is Unicode native rather than Unicode aware. All APIs support the Universal Character Set, and the nccell API is based around Unicode's Extended Grapheme Cluster concept, the same unit a user perceives as one character, which matters the moment emoji, combining marks or right-to-left scripts enter a grid of cells. Color follows the same assume-the-maximum rule, all APIs natively support 24-bit color, quantized down as necessary for the terminal, so the same code path drives a truecolor terminal and an older 256-color one without a separate API. High-contrast text, transparent regions, sprites, images, fonts and video are listed as visual features, and the identifier surface is kept orderly, exported names prefixed to avoid namespace collisions and static inline header-only code used where reasonable, which the README credits with better compiler optimization and reduced loader time.

Sixel, Kitty, and the Linux framebuffer console

Bitmapped graphics are portable across three delivery mechanisms, Sixel, the Kitty graphics protocol, and even the Linux framebuffer console, so pixel output does not depend on a single terminal's extension. Above that sit the multimedia features, video playback and scaling through FFmpeg's libraries and image handling through OpenImageIO, all optional at build time, with a build configuration available that omits multimedia entirely and requires a significantly lesser set of dependencies. Keyboard input gets its own modernization, support for unambiguous keyboard protocols following the Kitty keyboard protocol specification instead of the escape-sequence guessing game. The repository carries a TERMINALS.md at its root for terminal compatibility details, and the README flags a dedicated environment notes section for anyone running Notcurses applications inside Docker.

Two modes: full-screen TUI, or scrolling CLI

Notcurses splits its usage model in two. TUI mode facilitates high-performance, non-scrolling, full-screen applications, the dashboard and interface case where the program owns the screen. CLI mode supports scrolling output for shell utilities, but with the full power of Notcurses, meaning a command line tool can emit styled, colored, even graphical output and still behave like a filter in a pipeline. Thread safety and efficient use in parallel programs has been a design consideration from the beginning, per the feature list, which pairs naturally with the two modes, a long-lived TUI rendering on one thread while workers prepare data. The practical demonstration is notcurses-demo, which the README says covers most of the functionality of Notcurses, a single program a prospective adopter can run against a candidate terminal to see what it can actually do before writing any code.

A dependency list with honest minimums

The requirements section opens with a caveat worth quoting, minimum versions generally indicate the oldest version the author has tested with, and it may well be possible to use still older versions. The hard build requirements are CMake 3.21.0+ and a C17 compiler, with C++17 needed only for OpenImageIO, testing or the C++ bindings. At build and runtime, terminfo 6.1+ from NCURSES and GNU libunistring 0.9.10+ are required. The optional set is long, libgpm 1.20+ for console mouse, libqrcodegen 1.5.0+ from QR-Code-generator, the FFmpeg libraries at libswscale 5.0+, libavformat 57.0+, libavutil 56.0+ and libavdevice 57.0+, OpenImageIO 2.15.0+, Doctest 2.3.5+ for testing, pandoc 1.19.2+ for documentation, and Python 3.7+ with CFFI 1.13.2+ and pypandoc 1.5+ for the bindings. Supported runtimes are Linux 2.6+, FreeBSD 11+, DragonFly BSD 5.9+, Windows 10 v1093+ and macOS 11.4+, with INSTALL.md carrying the build details.

A free guidebook, a demo, and wrappers from Ada to Nim

Documentation is unusually substantial for a C library. Man pages live at notcurses.com, Doxygen output at notcurses.com/html, the wiki on dankwiki holds the overview, and the author wrote a coherent guidebook available for free download as a PDF, with a paperback edition on Amazon. Documented examples are admitted to be few, with the compensation being the many small C programs in src/poc and C++ programs in src/pocpp, plus notcurses-demo. Language wrappers extend reach beyond C, several in repository and others external, with named leads, Ada via notcursesada, C++ built in, Dart via dart_notcurses, Julia via Notcurses.jl, and a Nim binding, alongside the Python package on PyPI and libnotcurses-sys on crates.io. Releases carry names, v3.0.17 blood in the cut on 2025-10-28, v3.0.16 van down by the river, v3.0.15 back to bsd, with the last repository push on 2026-05-18.

Editorial conclusion

Choose Notcurses when the target is a modern terminal emulator on a workstation, laptop, phone or tablet and the interface wants images, video, sprites or saturated color that NCURSES was never designed around, or when thread safety and parallel use are core requirements. Stay with NCURSES when the target is industrial or retail hardware, critical applications, or maximum portability and time tested reliability, the project itself directs you there for those cases. Before adopting, verify your build satisfies the hard requirements, CMake 3.21.0+, C17, terminfo 6.1+ and libunistring 0.9.10+, decide whether the multimedia stack with its FFmpeg dependency belongs in your build, and consult the environment notes if you plan to run inside Docker.

Frequently asked questions

What is the difference between notcurses and ncurses?

Notcurses is not a source-compatible X/Open Curses implementation and not a drop-in NCURSES replacement, having abandoned the X/Open Curses API from the Single UNIX Specification. It does use the terminfo library shipped with NCURSES, and where NCURSES assumes a minimal terminal, Notcurses assumes a maximal one and steps down as needed, targeting modern emulators rather than legacy hardware.

What is Notcurses?

Notcurses is a C library for complex TUIs and character graphics on modern terminal emulators, supporting vivid colors, multimedia, threads and Unicode to the maximum degree possible. It offers 24-bit color quantized down as needed, Sixel, Kitty and framebuffer graphics, and both a full-screen TUI mode and a scrolling CLI mode, all Apache2 licensed.

How do you learn Notcurses?

The author wrote a guidebook available for free as a PDF, with a paperback edition sold on Amazon, and the man pages plus Doxygen output are published at notcurses.com. For code, the src/poc and src/pocpp directories hold many small C and C++ programs, and notcurses-demo demonstrates most of the library's functionality in one place.

Official sources

  1. dankamongmen/notcurses on GitHub
  2. Issues
  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/dankamongmen-notcurses.svg)](https://hysenlabs.com/projects/dankamongmen-notcurses)