# Ncurses

**Ncurses** ("new curses") is a free-software library that gives programs a terminal-independent way to draw and update character-cell screens, emulating the curses library of System V Release 4 (SVr4) and more: it uses the terminfo format and supports pads, color, multiple highlights, forms characters, and function-key mapping.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup> It is used in almost every system based on the [Linux kernel](https://www.edgepedia.org/linux-kernel) aside from some embedded applications, and serving as the system curses library on OpenBSD, FreeBSD, and macOS.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup> The name traces to a pun on "cursor optimization": rather than having every application query the terminal database and send control characters itself, the library wraps that work.<sup>[2](https://tldp.org/HOWTO/html_single/NCURSES-Programming-HOWTO/index.html)</sup>

| Key fact | Detail |
|---|---|
| What it is | Free-software emulation of SVr4 curses using terminfo; the approved replacement for discontinued 4.4BSD classic curses<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup><sup> • </sup><sup>[3](https://man.openbsd.org/ncurses)</sup> |
| API size | ncurses: 153 macros, 357 public symbols; ncursesw: 219 macros, 454 public symbols<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup> |
| Screen model | Two screen images, curscr (physical) and newscr (virtual); refresh computes an optimized set of operations to mutate the screen from its previous state<sup>[5](https://invisible-island.net/ncurses/ncurses-intro.html)</sup><sup> • </sup><sup>[6](https://man7.org/linux/man-pages/man3/ncurses.3x.html)</sup> |
| Standards | 8-bit clean, base-level conformant with X/Open Curses, implementing all BASE and almost all EXTENDED features<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup> |
| Color and input | 16-color, 256-color, and direct-color terminals; mouse event reporting with xterm and FreeBSD and OS/2 consoles<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup> |
| Releases | 6.5 released April 27, 2024; 6.6 released December 30, 2025, focused on the MinGW/Windows terminal driver<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup><sup> • </sup><sup>[7](https://invisible-island.net/ncurses/announce.html)</sup> |
| Maintainer | Thomas E. Dickey; copyright held by the Free Software Foundation for releases 4.2 through 6.1, reverting to Dickey with release 6.2<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup> |

## History and lineage

The curses library was first published in 4.0BSD in late 1980, a year after 3BSD. Its original routines were written by students at UC Berkeley to provide screen handling for the vi editor using the termcap database; a related account credits the first library, written around 1980, with supporting the screen-oriented dungeon game rogue.<sup>[5](https://invisible-island.net/ncurses/ncurses-intro.html)</sup><sup> • </sup><sup>[8](https://linuxjournal.rkidder.com/article/1124.html)</sup>

A Berkeley student who later went to AT&T Bell Labs created terminfo, an improved termcap library, and adapted curses to use it; that version shipped in System V Release 2 in early 1984.<sup>[5](https://invisible-island.net/ncurses/ncurses-intro.html)</sup> The ncurses package itself originated in Pavel Curtis' pcurses. Zeyd Ben-Halim was the original maintainer, [Eric S. Raymond](https://www.edgepedia.org/eric-s-raymond) wrote many features after version 1.8.1, Jürgen Pfeifer wrote the menu, forms, and Ada95 code, and Thomas Dickey has been the ongoing maintainer; the change log traces the work to Ben-Halim starting with Curtis' pcurses in 1992.<sup>[5](https://invisible-island.net/ncurses/ncurses-intro.html)</sup><sup> • </sup><sup>[9](https://github.com/ThomasDickey/ncurses-snapshots/blob/v6_6_20251231/NEWS)</sup> The current library replaces the curses libraries from SVr4 and 4.4BSD Unix, whose development ceased in the 1990s.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup>

## How it works: terminfo and screen optimization

**Terminfo lookup.** Curses describes terminal capabilities through terminfo, a database format that can describe thousands of different terminals.<sup>[5](https://invisible-island.net/ncurses/ncurses-intro.html)</sup> [Bell Labs](https://www.edgepedia.org/bell-labs) replaced the all-text termcap format with terminfo, whose compiled entries use a binary format, primarily because the BSD termcap database had grown so large that sequential searching took significant overhead; terminfo's binary capability blocks in a bushy directory tree were optimized for fast lookup and fast loading.<sup>[8](https://linuxjournal.rkidder.com/article/1124.html)</sup> Since 2006, ncurses has also supported an alternate configuration storing compiled binary entries in a hashed terminal database to improve runtime performance; FreeBSD used termcap until 2021, and OpenBSD used terminfo with source-only entries until 2015.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup> The library can also be built with pre-loaded fallback terminfo entries so that screen-oriented programs work in single-user mode without a terminfo tree.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup>

**Double-buffering and refresh.** Curses maintains two screen images: curscr, a picture of what the terminal currently shows, and stdscr, the standard screen on which the programmer makes changes.<sup>[5](https://invisible-island.net/ncurses/ncurses-intro.html)</sup> The library does not update the terminal automatically; the programmer accumulates changes and calls refresh, and the library optimizes output by computing a minimal volume of operations to mutate the screen from its state at the previous refresh.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup><sup> • </sup><sup>[6](https://man7.org/linux/man-pages/man3/ncurses.3x.html)</sup> For multi-window layouts, calling wnoutrefresh() for each window and then doupdate() once can produce a single burst of output with fewer total characters transmitted, avoiding the flicker of repeated wrefresh() calls.<sup>[5](https://invisible-island.net/ncurses/ncurses-intro.html)</sup>

**The optimizer internals.** The update machinery lives in three modules: hashmap.c, hardscroll.c, and lib_doupdate.c.<sup>[11](https://invisible-island.net/ncurses/hackguide.html)</sup> hashmap.c detects vertical motion changes between the real and virtual screens, using oldindex members in the newscr structure plus a modified Heckel algorithm applied to hash values generated from line contents. hardscroll.c computes an optimum set of scroll, insertion, and deletion operations and calls _nc_mvcur_scrolln() to perform them. lib_doupdate.c performs line-by-line transformations of curscr lines into newscr lines, relying on the mvcur() routine in lib_mvcur.c, which moves the cursor from one location to another in the fewest output characters possible.<sup>[11](https://invisible-island.net/ncurses/hackguide.html)</sup> The screen-update code's algorithm for hardware scrolling, line-insertion, and line-deletion is more powerful than the 4.4BSD curses quickch routine, and contemporary assessment judged ncurses' cursor-movement optimizer and incremental-update algorithms smarter than both the Bell Labs and BSD versions.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup><sup> • </sup><sup>[8](https://linuxjournal.rkidder.com/article/1124.html)</sup>

## The API in brief

The central data structure is the window, a rectangular grid of character cells addressed by (y, x) coordinates with the upper left corner at (0, 0). stdscr is the default window the size of the terminal screen; others are created with newwin.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup> Pads are special windows not constrained to the screen size, whose contents need not be completely displayed, useful for scrolling viewports larger than the terminal.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup><sup> • </sup><sup>[3](https://man.openbsd.org/ncurses)</sup> The line discipline (raw, cbreak, or canonical mode) is a property of the SCREEN, applying identically to all windows associated with it.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup>

Beyond drawing, the library provides terminal-independent keyboard and mouse input, color and rendering attributes such as bold and underline, soft label keys, direct access to the terminfo database, a termcap compatibility interface, and a termios abstraction.<sup>[12](https://manpages.ubuntu.com/manpages/questing/man3/ncurses.3ncurses.html)</sup> It supports 16-color, 256-color, and direct-color terminals such as modern xterm, and mouse event reporting with xterm and FreeBSD and [OS/2](https://www.edgepedia.org/os-2) console windows; 256-color support arrived in ncurses 6.0 and direct color in 6.1, so older system copies such as the 5.7 release once shipped by macOS and OpenBSD lack them.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup><sup> • </sup><sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup>

**Wide characters.** Wide-character support is enabled by the --enable-widec configure option, which has been the default for ABI 6+ since October 21, 2023; it renames the library so applications link with -lncursesw instead of -lncurses.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup> At initialization ncurses inspects the TERM environment variable and, in a UTF-8 locale, outputs Unicode code points for forms-drawing characters when the Linux virtual console or GNU screen ignore VT100 alternate character sets.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup>

## By the numbers

The FAQ tabulates public symbol counts per implementation: ncurses offers 153 macros and 357 public symbols, the wide-character ncursesw offers 219 macros and 454 public symbols, and the sp-funcs variants ncursest and ncurseswt have 439/332 and 541/429 public symbols respectively.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup> Adoption is broad: as of September 2023, slightly less than half of NetBSD packages whose build script mentions curses specified ncurses, 189 of 394.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup> As of January 2020, macOS and OpenBSD shipped ncurses 5.7 (from 2008) as their system curses library, though OpenBSD's current manual page describes ncurses 6.4 (patch 20230826).<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup><sup> • </sup><sup>[3](https://man.openbsd.org/ncurses)</sup>

## Applications built on ncurses

Solaris installs ncurses for use by programs including bash, cmake, gdb, less, lftp, lynx, mutt, nano, python (multiple versions), ruby, tmux, vim, xterm, and zsh.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup> A useful distinction: applications that do their own display optimization, such as vim, are not curses applications; a curses application may use terminfo functions, but the reverse does not hold.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup>

## How it compares with alternatives

**PDCurses** lacks the functions used to obtain terminfo information, though X/Open Curses documentation permits curses implementations without terminfo or termcap, so this does not prevent it from being a curses implementation.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup> **S-Lang** may use the termcap file or its own subset-of-ncurses interface to the terminfo database, but it overrides the terminfo/termcap data with its author's assumptions, which can differ radically from the actual terminal's capabilities.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup> Programs such as ELinks and its ancestors links and links2 go further, assuming everything is some variation of Linux console, xterm, or color-vt100 rather than consulting terminfo at all.<sup>[4](https://invisible-island.net/ncurses/ncurses.faq.html)</sup>

**Notcurses** is an intellectual descendant of ncurses that builds atop the terminfo abstraction layer but abandons the X/Open Curses API of the [Single UNIX Specification](https://www.edgepedia.org/single-unix-specification); it is not a source-compatible curses implementation or drop-in ncurses replacement.<sup>[13](https://notcurses.com/notcurses.3.html)</sup><sup> • </sup><sup>[14](https://github.com/dankamongmen/notcurses)</sup> It targets modern terminal emulators with vivid colors, multimedia, threads, and Unicode, enables 24-bit color natively with quantization as needed, offers thread safety and native Unicode via Extended Grapheme Clusters, and provides both full-screen "TUI mode" and scrolling "CLI mode". Wherever possible it uses the terminfo library shipped with ncurses, benefiting from that library's portability and thoroughness, and it requires a correct TERM value and an up-to-date terminfo database.<sup>[14](https://github.com/dankamongmen/notcurses)</sup> On licensing, Notcurses is Apache2-licensed in its entirety, which its author contrasts with the ncurses license, summarized as "a restatement of MIT-X11".<sup>[14](https://github.com/dankamongmen/notcurses)</sup>

## Recent developments

**Releases.** ncurses 6.5 was released on April 27, 2024 and is source-compatible with ncurses 5.0 through 6.4.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup> It adds the tiscan_s and tiparm_s functions, letting applications declare the number of string parameters expected by a capability, which addresses format-string safety, and a compile-time --enable-check-size feature that obtains the screen size via an ANSI cursor-position report (the user6/user7 terminfo capabilities) when neither environment variables nor ioctl provide it.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup> ncurses 6.6 followed on December 30, 2025, remaining source-compatible back to 5.0 and focusing on improvements to the MinGW/Windows terminal driver developed over the preceding years.<sup>[7](https://invisible-island.net/ncurses/announce.html)</sup><sup> • </sup><sup>[15](https://www.phoronix.com/news/Ncurses-6.6)</sup> Patch-level maintenance has continued: a 6.6 patch release dated 2026-02-07 updated the infocmp and terminfo documentation and misc/terminfo.src, showing ongoing terminfo database upkeep.<sup>[16](https://lists.nongnu.org/archive/html/bug-ncurses/2026-02/msg00016.html)</sup>

**Configuration and ownership.** The --enable-widec option became the default for ABI 6+ builds on October 21, 2023, making wide-character support the standard configuration and shifting the link name to -lncursesw.<sup>[10](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)</sup> On ownership, Thomas E. Dickey has acted as maintainer for the [Free Software Foundation](https://www.edgepedia.org/free-software-foundation), which held copyright for releases 4.2 through 6.1; effective with release 6.2, copyright reverted to Dickey, who continues development independently.<sup>[1](https://invisible-island.net/ncurses/announce-6.5.html)</sup><sup> • </sup><sup>[7](https://invisible-island.net/ncurses/announce.html)</sup>

## References

1. [Announcing ncurses 6.5, Thomas E. Dickey, invisible-island.net](https://invisible-island.net/ncurses/announce-6.5.html)
2. [NCURSES Programming HOWTO, The Linux Documentation Project](https://tldp.org/HOWTO/html_single/NCURSES-Programming-HOWTO/index.html)
3. [curses(3), OpenBSD manual pages](https://man.openbsd.org/ncurses)
4. [NCURSES Frequently Asked Questions, Thomas E. Dickey, invisible-island.net](https://invisible-island.net/ncurses/ncurses.faq.html)
5. [Writing Programs with NCURSES (Intro), Thomas E. Dickey, invisible-island.net](https://invisible-island.net/ncurses/ncurses-intro.html)
6. [ncurses(3x), Linux man-pages project](https://man7.org/linux/man-pages/man3/ncurses.3x.html)
7. [Announcing ncurses 6.6, Thomas E. Dickey, invisible-island.net](https://invisible-island.net/ncurses/announce.html)
8. [ncurses: Portable Screen-Handling for Linux, Linux Journal](https://linuxjournal.rkidder.com/article/1124.html)
9. [NEWS at v6_6_20251231, ThomasDickey/ncurses-snapshots, GitHub](https://github.com/ThomasDickey/ncurses-snapshots/blob/v6_6_20251231/NEWS)
10. [curses(3ncurses), Debian testing manpages (ncurses 6.5, patch 20251123)](https://manpages.debian.org/testing/ncurses-doc/curses.3ncurses.en.html)
11. [A Hacker's Guide to Ncurses Internals, Thomas E. Dickey, invisible-island.net](https://invisible-island.net/ncurses/hackguide.html)
12. [ncurses(3ncurses), Ubuntu manpages (6.5, patch 20250216)](https://manpages.ubuntu.com/manpages/questing/man3/ncurses.3ncurses.html)
13. [notcurses(3), official manual page](https://notcurses.com/notcurses.3.html)
14. [dankamongmen/notcurses, GitHub repository](https://github.com/dankamongmen/notcurses)
15. [Ncurses 6.6 Released With Improved Windows Terminal Support, Phoronix](https://www.phoronix.com/news/Ncurses-6.6)
16. [ANN: ncurses-6.6-20260207, bug-ncurses mailing list](https://lists.nongnu.org/archive/html/bug-ncurses/2026-02/msg00016.html)

---
*Topic: Encyclopedia › Technology and the built world › Computing and digital systems › Software and programming › Named software products and platforms › Search, maps, email, and productivity services*

*Initially written Sep 17, 2026 · Reviewed: Oct 15, 2026 · Edited: Oct 15, 2026 · Last review: Oct 15, 2026*

*Copyright 2026 EdgeChat AI, a subsidiary of Biostate AI.*

License: Edgepedia Community License 1.0, https://www.edgepedia.org/edgepedia/license
