#event #color #cli #input #terminal


An crossplatform terminal library for manipulating terminals

46 releases (16 breaking)

✓ Uses Rust 2018 edition

new 0.17.5 May 23, 2020
0.17.3 Apr 9, 2020
0.17.1 Mar 28, 2020
0.14.1 Dec 17, 2019
0.2.0 Jan 27, 2018

#6 in Command-line interface

Download history 5752/week @ 2020-02-06 6872/week @ 2020-02-13 6786/week @ 2020-02-20 6782/week @ 2020-02-27 8609/week @ 2020-03-05 6102/week @ 2020-03-12 5678/week @ 2020-03-19 6232/week @ 2020-03-26 5458/week @ 2020-04-02 6957/week @ 2020-04-09 8785/week @ 2020-04-16 7515/week @ 2020-04-23 7628/week @ 2020-04-30 8988/week @ 2020-05-07 8081/week @ 2020-05-14 5746/week @ 2020-05-21

30,921 downloads per month
Used in 132 crates (110 directly)

MIT license

4.5K SLoC

Donate Travis Latest Version MIT docs Lines of Code Join us on Discord

Cross-platform Terminal Manipulation Library

Crossterm is a pure-rust, terminal manipulation library that makes it possible to write cross-platform text-based interfaces (see features). It supports all UNIX and Windows terminals down to Windows 7 (not all terminals are tested, see Tested Terminals for more info).

Table of Contents


  • Cross-platform
  • Multi-threaded (send, sync)
  • Detailed documentation
  • Few dependencies
  • Full control over writing and flushing output buffer
  • Is tty
  • Cursor
    • Move the cursor N times (up, down, left, right)
    • Move to previous / next line
    • Move to column
    • Set/get the cursor position
    • Store the cursor position and restore to it later
    • Hide/show the cursor
    • Enable/disable cursor blinking (not all terminals do support this feature)
  • Styled output
    • Foreground color (16 base colors)
    • Background color (16 base colors)
    • 256 (ANSI) color support (Windows 10 and UNIX only)
    • RGB color support (Windows 10 and UNIX only)
    • Text attributes like bold, italic, underscore, crossed, etc
  • Terminal
    • Clear (all lines, current line, from cursor down and up, until new line)
    • Scroll up, down
    • Set/get the terminal size
    • Exit current process
    • Alternate screen
    • Raw screen
    • Set terminal title
  • Event
    • Input Events
    • Mouse Events (press, release, position, button, drag)
    • Terminal Resize Events
    • Advanced modifier (SHIFT | ALT | CTRL) support for both mouse and key events and
    • futures Stream (feature 'event-stream')
    • Poll/read API

Tested Terminals

  • Console Host
    • Windows 10 (Pro)
    • Windows 8.1 (N)
  • Ubuntu Desktop Terminal
    • Ubuntu 17.10
  • (Arch, Manjaro) KDE Konsole
  • (Arch) Kitty
  • Linux Mint

This crate supports all UNIX terminals and Windows terminals down to Windows 7; however, not all of the terminals have been tested. If you have used this library for a terminal other than the above list without issues, then feel free to add it to the above list - I really would appreciate it!

Getting Started

see the examples directory and documentation for more advanced examples.

Click to show Cargo.toml.
crossterm = "0.17"

use std::io::{stdout, Write};

use crossterm::{
    style::{Color, Print, ResetColor, SetBackgroundColor, SetForegroundColor},
    ExecutableCommand, Result,

fn main() -> Result<()> {
    // using the macro
        Print("Styled text here."),

    // or using functions
        .execute(Print("Styled text here."))?

Checkout this list with all possible commands.

Feature Flags

To optional feature flags.

version = "0.17"
features = ["event-stream"] 
Feature Description
event-stream futures::Stream producing Result<Event>.

Dependency Justification

Dependency Used for Included
bitflags KeyModifiers, those are differ based on input. always
lazy_static original console color, original terminal mode, saved cursor position, supports ANSI on windows, single event reader per application. always
parking_lot used for an RW LOCK. always
libc UNIX terminal_size/raw modes/set_title and several other lowlevel functionality. UNIX only
Mio event readiness polling, waking up poller UNIX only
signal-hook signalhook is used to handle terminal resize SIGNAL with Mio. UNIX only
winapi Used for low-level windows system calls which ANSI codes can't replace windows only
futures Can be used to for async stream of events only with a feature flag
serve Se/dese/realizing of events only with a feature flag

Other Resources

Used By


We highly appreciate when anyone contributes to this crate. Before you do, please, read the Contributing guidelines.


  • Timon Post - Project Owner & creator


This project, crossterm and all its sub-crates: crossterm_screen, crossterm_cursor, crossterm_style, crossterm_input, crossterm_terminal, crossterm_winapi, crossterm_utils are licensed under the MIT License - see the LICENSE file for details.


~24K SLoC