Crates.io | tattoy |
lib.rs | tattoy |
version | 0.1.8 |
created_at | 2025-06-27 16:53:51.47207+00 |
updated_at | 2025-07-28 22:06:32.261731+00 |
description | Text-based compositor for modern terminals |
homepage | |
repository | https://github.com/tattoy-org/tattoy |
max_upload_size | |
id | 1728974 |
size | 462,541 |
— logo by Sam Foster
Tattoy can generally be thought of as a framework for adding eye-candy to your terminal. It's purely text-based so works in any terminal emulator that supports true colour. "Graphics" is rendered with UTF8 half-blocks (▀,▄). Whilst most of its effects are for getting you street credibility it also has more powerful features based around its awareness of terminal contents. For example it can detect and auto adjust text contrast whilst remaining faithful to the terminal's palette.
Tattoy works with your existing shell, theme and prompt, etc. It can always and immediately toggle between its effects and your normal terminal state, allowing for easy copy-pasting for example.
See tattoy.sh for more details and screenshots.
See the documentation for full details.
The engine of Tattoy is a headless terminal emulator called the Shadow Terminal. Tattoy then takes the purely text-based output of this in-memory terminal, composites it with other text-based layers and then prints it to the user's host terminal. So even though it's a fully-modern terminal, it does not itself manage any GUI windows or font glyph rendering.
There are quite a few terminals, PTYs, shadow PTYs, surfaces, etc, that are all terminal-like in some way, but do different things.
We use cargo nextest
, which you will need to install if you haven't already.
cargo build --all; cargo nextest run
In CI I use cargo nextest run --retries 2
because some of the end-to-end tests are flaky.
log_level = "trace"
in $XDG_CONFIG_DIR/tattoy/tattoy.toml
TATTOY_LOG="tattoy_wezterm_term=off,tattoy=debug,wgpu=debug" tattoy
.$XDG_STATE_DIR/tattoy/tattoy.log
.log_path = "/tmp/tattoy.log"
in $XDG_CONFIG_DIR/tattoy/tattoy.toml
--log-path
CLI argument.