Skip to content

In kitty and Ghostty, About shows ASCII art instead of the artwork #164

Closed
1 of 1 issue completed
Closed

Description

@jamescrosswell

Opportunity

In kitty and Ghostty, two of the terminals we recommend, About (tui) shows ASCII art instead of the artwork.

The About dialog is the one place TuiCode shows its own face, and today which version you see depends on your terminal. It's not a daily-driver gap, but it's a visible rough edge in terminals the vision's user is likely to use.

Evidence

  • AGENTS.md, About dialog: the image is drawn as a sixel, so it shows in WezTerm, iTerm2, tmux 3.6, Windows Terminal and foot. kitty and Ghostty don't speak sixel, and Terminal.Gui 2.1.0 has no kitty graphics, so they get the ASCII art. So does Alacritty, which speaks neither.
  • Terminal.Gui 2.5 adds ImageView (docs, source). It draws through the kitty graphics protocol first, then sixel, and otherwise falls back to one coloured space per cell. kitty support is detected from KITTY_WINDOW_ID or TERM_PROGRAM=kitty|ghostty.
  • The driver in 2.5 also lets the app set what it detected (SetSixelSupport, SetKittyGraphicsSupport), so our own probe can keep doing what TG's gets wrong: iTerm2's Retina cell size (About's image fills the dialog on a Retina screen #333) and tmux's DA1 reply.
  • TuiCode is on 2.5.0 now (Move TuiCode to Terminal.Gui 2.5 and MentalDesk.Tui 0.2.0 #442 is done), so ImageView is available today.

Options considered

  1. Do nothing. ASCII art is a fine fallback and costs nothing. But kitty and Ghostty users never see the artwork, and the dialog says nothing about why.
  2. Our own kitty graphics encoder. Full control over placement, but it's a protocol encoder we'd own when TG 2.5, which we're now on, ships one.
  3. ImageView everywhere, including its cell fallback (your suggestion, taken literally). One code path, and every terminal shows something in colour. But at the About dialog's size (about 60 × 12 cells) the cell fallback is a blurry mosaic, a step down from the ASCII art, which at least reads as a logo.
  4. ImageView for the image, ASCII art where there's no image protocol. ← proposed. kitty and Ghostty get the artwork through kitty graphics, sixel terminals keep it, and Alacritty, Terminal.app and SSH sessions without either keep the ASCII art. We drop our own sixel drawing code in favour of TG's, but keep our probe, which knows things TG's doesn't.

Proposal

About shows the artwork in kitty and Ghostty too, drawn by Terminal.Gui's ImageView.

  • In kitty and Ghostty, tui shows the same image WezTerm and iTerm2 show today.
  • Sixel terminals look exactly as they do now: right size on Retina, no dark band under the image in iTerm2, and it works inside tmux 3.6.
  • Terminals with neither protocol keep the ASCII art, unchanged.
  • The image still appears straight away on a second open, and nothing is left on screen after closing.
  • F12 Diagnostics says which way the image is drawn: kitty graphics, sixel or none (ASCII art).

Mockup

tui in Ghostty, before:

┌ About ───────────────────────────────────────────────────────────┐
│                 _.--._                                           │
│               ,'  o   `==-     ████████╗ ██╗   ██╗ ██╗           │
│              /   ,--.          ╚══██╔══╝ ██║   ██║ ██║           │
│             /   ( @@ )            ██║    ██║   ██║ ██║           │
│                         …                                        │
│                     Version 0.x.y                                │
│              https://github.com/mentaldesk/TuiCode               │
│                       Esc · Enter  close                         │
└──────────────────────────────────────────────────────────────────┘

After (the artwork, drawn as a kitty graphics image):

┌ About ───────────────────────────────────────────────────────────┐
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  image  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │
│                     Version 0.x.y                                │
│              https://github.com/mentaldesk/TuiCode               │
│                       Esc · Enter  close                         │
└──────────────────────────────────────────────────────────────────┘

F12 Diagnostics gains one line:

│ Image protocol   kitty graphics                                  │

Scope

In

  • About drawn with ImageView: kitty graphics where detected, sixel where our probe finds it, ASCII art otherwise.
  • Feeding our probe's sixel result and cell size to the driver, so TG's own detection doesn't regress iTerm2 or tmux.
  • The Diagnostics line.
  • Removing the sixel drawing code ImageView replaces.

Out

  • ImageView's cell fallback (option 3).
  • Kitty graphics inside tmux (it needs passthrough set up in tmux; tmux users keep sixel or the ASCII art).
  • Images anywhere else, such as previewing image files from the explorer. That would be an idea of its own.
  • ImageView's pan and zoom keys. About is a picture, not a viewer.

Delivery

One PR: About on ImageView for both protocols and the Diagnostics line, with the sixel terminals checked for regressions.

Decided

All of these were the Lead's calls, accepted when you approved; you didn't need to answer anything.

  • ASCII art stays the fallback, not ImageView's cell mosaic. At the dialog's size the mosaic doesn't read as the logo; the ASCII art does. If you'd rather see colour everywhere, say so and the fallback becomes ImageView's.
  • TG's kitty graphics, not our own. We're on 2.5 now, so building it ourselves means owning code TG already ships.
  • Our probe stays. TG's sixel detector waits a second on iTerm2 and gets its Retina cell size wrong (AGENTS.md, About dialog), so we tell the driver what we found instead.
  • Over SSH, kitty and Ghostty usually fall back to ASCII art, because the variables TG detects them by aren't forwarded. That's the same as today, and not worth a probe of our own.

Original idea

We currently fall back to ASCII art if the Terminal doesn't support Sixel.

It looks like Terminal.Gui has an Image component that would allow rendering images in all terminals... possibly a better solution?

Activity

  1. added
    pitchAn a-team pitch: Lead shapes it, reviewer approves it
    on Oct 7, 2026
  2. changed the title [-]Improved image rendering in the About dialog[/-] [+]In kitty and Ghostty, About shows ASCII art instead of the artwork[/+] on Oct 7, 2026
  3. a-team-app commented on Oct 8, 2026

    @a-team-app
    Contributor

    Now in front of you. Two small changes since drafting: it notes the Terminal.Gui 2.5 move (#442) is now in progress as #472, and the breakdown is now a Delivery section, still one PR that waits on #442.

  4. added
    a-team:displacedDisplaced from Pitched once already; its later moves go unannounced
    on Oct 8, 2026
  5. a-team-app commented on Oct 8, 2026

    @a-team-app
    Contributor

    Back to Exploring: #467 (file history, High) took this slot. It keeps its priority and comes back on its own once a slot frees. I won't comment on it moving again unless it changes.

  6. a-team-app commented on Oct 13, 2026

    @a-team-app
    Contributor

    Pitched again. One thing changed since the draft: #442 has landed and we're on Terminal.Gui 2.5.0, so ImageView is available now. I dropped "waits on #442" from Delivery and Scope, and reworded the matching Assumed line. The proposal itself is the same.

  7. a-team-app commented on Oct 13, 2026

    @a-team-app
    Contributor

    Building, as one task: #537. Nothing I had to settle beyond what you approved; the Assumed list is now Decided.

  8. a-team-app commented on Oct 14, 2026

    @a-team-app
    Contributor

    Tried on origin/main (a37ee7a), through tuirec. It says it's kitty, so KITTY_WINDOW_ID is set. About sends the artwork as a kitty graphics image (522×280) with no sixel, and F12 Diagnostics shows Image protocol: kitty graphics. tuirec can't take the kitty variable away, so I couldn't try the ASCII-art and sixel fallbacks by hand. AboutImageHostTests covers which protocol gets picked. Closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    a-team:displacedDisplaced from Pitched once already; its later moves go unannouncedpitchAn a-team pitch: Lead shapes it, reviewer approves it

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions