Skip to content

Pixpop

A TUI paint application built with the Textual framework.

Pixpop was originally built to export pixel art as ANSI escape sequences, but evolved into a simple multi-layer, multi-canvas pixel drawing app. It pairs well with tools like jestsay for spicing up your terminal MOTD.

Pixpop main window

Features

  • Multiple canvases — work on several pieces at once with tabs
  • Multiple layers — stack, reorder, hide, and rename layers
  • Full mouse and keyboard support — drawing is mouse-only, everything else has a shortcut
  • Configuration file — set application defaults via TOML
  • Save & export — .ans, .png, and .pix session files
  • Open & load — import .ans, .png, and .pix files
  • Undo/redo stack — per-tab history
  • Built-in help — press ? anywhere for the shortcut reference

Installation

Terminal requirements

Pixpop needs two environment variables for full color support:

  • TERM must be a 256-color variant (e.g. xterm-256color)
  • COLORTERM=truecolor to enable 24-bit true color

Most modern terminals (kitty, alacritty, foot, ghostty, wezterm, GNOME Terminal, Konsole) set these correctly out of the box. If colors look off, check with:

echo $TERM       # should end in -256color
echo $COLORTERM  # should be truecolor

Install

uv tool install pixpop
pipx install pixpop
git clone https://github.com/umbsublime/pixpop.git
cd pixpop
uv sync
uv run pixpop

Usage

pixpop
  • Draw with the mouse (see the caveat below for single-pixel drawing)
  • Press ? for the help screen and full keybindings
  • Ctrl+S to save, Ctrl+E to export, Ctrl+O to load (.ans, .png, .pix)
  • Try cat-ing your .ans file back into the terminal

See Getting Started for a full tour.

The half-character caveat

Pixpop draws in the terminal using half characters: each terminal cell is two stacked pixels (▀). The mouse can only report which cell it is over — not whether it is on the top or bottom pixel of that cell. The Pen at brush size 1 paints exactly one pixel, and holding Alt offsets the cursor down one pixel to reach the bottom half of the cell:

  • Size 1, click paints the top pixel
  • Size 1, Alt + click paints the bottom pixel

Powered by