shitty logo

shitty

A serious terminal emulator with a stupid name

Developer ToolsPythonNOASSERTION 235 15Health 77
releasebrew pg83/tap/shittyplatforms macOS | Linuxascii 118 MiB/s · 1.2× alacritty
GitHub

What is it?

What it is

Shitty is a low-latency, fast-startup terminal emulator built for predictable resource use, rendering cells with native compute backends (Vulkan on Linux, Metal on macOS) and sharing code with its polite-brand counterpart Pretty (pt).

Why it exists

To provide a blazingly fast, correct, flicker-free, indestructible terminal with Unicode grapheme cluster support, self-contained operation, and locked-down-by-default security, while offering a polite alternative (Pretty) for users who prefer a non-offensive name.

Who should use it

Developers needing high-performance terminal emulationPower users prioritizing speed and low latencySystem administrators optimizing terminal resources

Who should avoid it

Security-focused users due to memory-unsafetyBeginners lacking technical expertise for setupUsers requiring strict security guarantees

How it works

A quick walkthrough in plain English

How shitty works

Step 1 of 3

You interact with it

Open shitty, send a request, or connect it to your stack.

Features

VT52 through VT5xx controls and widely used xterm extensions
Primary and alternate screens, primary‑screen scrollback, margins, tabs, rectangular operations, protected cells, and synchronized output
Reflow of primary‑screen scrollback when the terminal width changes
Unicode grapheme clusters, combining characters, emoji sequences, and double‑width characters
DEC single‑width, double‑width, and double‑height lines
16‑colour, 256‑colour, and 24‑bit colour, including underline colour and extended underline styles
Legacy, modifyOtherKeys, and Kitty keyboard protocols
X10, VT200, UTF‑8, SGR, SGR‑pixel, and urxvt mouse protocols
Linear and rectangular selection, primary selection, clipboard integration, OSC 52 policy, and OSC 8 hyperlinks
Shell integration, notifications, progress reports, and in‑band resize reporting
Lazy glyph rasterization, a persistent GPU glyph cache, and damage‑driven compute rendering
Self‑contained binary with embedded fonts, no external windowing toolkit
Locked‑down default security: applications cannot read selections or control host window unless explicitly allowed
Fast startup, low latency, predictable resource use
Blazingly fast throughput (≈118 MiB/s) compared to other terminals

Advantages

  • Extremely fast performance with high throughput and low latency
  • Comprehensive correctness: 5,000+ tests, fuzzed parser, no crashes on random data
  • Flicker‑free rendering with damage‑driven updates
  • Indestructible parser state machine, total and fuzzed with corpora
  • Robust Unicode support: grapheme clusters, emoji, combining marks, wide CJK
  • Self‑contained: single binary, embedded fonts, no external dependencies
  • Locked‑down security: default restrictions on selection and window control

Disadvantages

  • Does not support bidirectional text layout
  • No inline graphics protocols such as sixel
  • Requires a Vulkan driver and Wayland compositor on Linux (may limit use on some systems)
  • Some historical DEC and xterm extensions are intentionally unsupported
  • Memory‑unsafe implementation (may be a concern for safety‑critical environments)

Installation

FAQ

How do I install Shitty on macOS using Homebrew?

Run `brew install pg83/tap/shitty` for the Shitty brand and `brew install pg83/tap/pretty` for the Pretty brand. The tap automatically tracks the latest release and installs the portable binaries `st-darwin-arm64.tar.gz` and `pt-darwin-arm64.tar.gz`.

How can I start a terminal with a specific size and scrollback capacity?

Use the `-geometry` and `-saveLines` options. For example: `./st -geometry 120x36 -saveLines 5000` starts a 120‑column by 36‑row terminal with 5,000 lines of scrollback.

How do I configure multiple fonts and fallbacks?

Pass `-font` multiple times or use a comma‑separated list. Later fonts act as fallbacks. Example: `./st -font 'DejaVu Sans Mono' -font 'Noto Sans Mono CJK JP'`. The terminal will automatically resolve regular, bold, italic, and bold‑italic faces and fall back to the embedded monospace‑emoji trio if no system font is available.

How can I remap a key combination to another or disable it?

Use the `-remap` flag or add a `remap` entry in the config file. Syntax: `-remap from=to`. Example: `./st -remap ctrl+b=ctrl+d -remap super+t=ctrl+shift+t -remap ctrl+l=none`. The remap applies to the application, kitty protocol, and terminal shortcuts.

How do I enable OSC 52 clipboard access or allow applications to read selections?

By default OSC 52 is disabled. Add `allowClipboard = true` or `allowOSC52 = true` in `~/.config/shitty/shitty.toml` (or the equivalent Pretty config) to grant trusted applications access to the clipboard and OSC 52 operations.

Loading documentation…
View on GitHub

Featured in Videos

YouTube tutorials and walkthroughs for shitty

Alternatives

Similar projects ranked by category, topics, and text overlap.

Compare
shitty | MushyBook