Pixels,
packed into text.

SSH Fighter draws a real RGB scene on the server, compresses it into Unicode block cells, then streams only what changed. Your terminal is the screen.

See the whole pipeline
Monsoon Palace arena rendered by SSH FighterXENONAJAX

One frame, end to end

30 Hzgame state
RGBpixel grid
2×4cell fit
ANSIframe diff
SSHyour screen

First, draw a real image.

Combat state becomes one 24-bit RGB pixel grid: packed arena art, area-scaled fighter sprites, projectiles, hit sparks, weather and a tiny pixel-font HUD. The logical canvas is always two pixels wide by four pixels tall for every terminal cell.

Simulation
30 Hz
Visual output
up to 15 Hz
Arena motifs
7.5 Hz

Then, fit pixels to glyphs.

For each 2×4 block, the renderer splits pixels by brightness, averages two truecolor groups, and chooses the block glyph whose shape matches the eight-bit pattern.

Quadrant universal defaultOctant eight sub-pixelsHalf safest fallback

Color survives the trip.

Each glyph carries independent 24-bit foreground and background colors. There is no forced web palette and no sixel dependency.

38;2;245;217;74  48;2;9;6;15  ▞

Only the motion travels.

Two cell buffers are compared every render. Unchanged scenery costs nothing; changed runs get one cursor move and only the ANSI color channels they need. SSH compression handles the rest.

sentESC[3;5H … 4 cells

Smooth by refusing stale work.

A slow connection never builds a queue of obsolete animation frames.

  1. Write blocksPause visual output.
  2. Game continuesInputs and the 30 Hz simulation keep moving.
  3. Stream drainsDiff from the newest frame—not the backlog.

Render work is capped at a 900×360 terminal, scales down on unusually large screens, and can move to a bounded worker pool.

Modern terminals get more. Nobody gets locked out.

With capability probing enabled, Kitty, Ghostty, WezTerm and other compatible terminals can show zlib-compressed true-pixel images on mostly static screens. Fights stay on the lighter cell-diff renderer. Unsupported replies are stripped and the universal path keeps working.

The trick is not one trick.

Original art, a deterministic pixel canvas, smart glyph fitting, exact diffs and strict backpressure make the terminal feel like an arcade cabinet.

$ ssh sshfighter.comRead the renderer source ↗