Readit News logoReadit News
Posted by u/tombh 3 months ago
Show HN: Tattoy – a text-based terminal compositortattoy.sh...
Whereas this is mostly a terminal eye-candy project to get you street cred, it does have some serious aspects.

Firstly it solves the age-old problem of low-contrast text, like when you `ls` a broken symlink and the red background colour is too near your current theme's foreground colour. Tattoy solves this by using none other than the web's WCAG 2.1 contrast algorithm for accessible text.

Secondly, an explicit design goal is that Tattoy should be able to polyfill new terminal protocols, the `xwayland` of the TTY if you will. Say if we want to experiment with completely deprecating ANSI codes, then any application that uses a new protocol can be run in Tattoy which itself runs in any ANSI-standard terminal emulator as normal. You can read more about this idea here: https://tattoy.sh/news/an-end-to-terminal-ansi-codes/

But ultimately this has been something more akin to an art project, something to enjoy for the sheer aesthetic pleasure.

tfsh · 3 months ago
This looks really cool, I'd like to give it a go. The idea of taking a screenshot of the terminal and then parsing that to determine the true colour support is definitely novel, though perhaps so, because for me I can't get it to work. Are there any debug flags I can enable?

So far it was able to take the screenshot correctly (https://ibin.co/8kaRr8TIanv2.png), however the parsing of that fails with the non-descript "Palette parsing failed." error.

Edit: enabled tracing at got this: https://paste.ee/p/ZyNxG9FK

shiomiru · 3 months ago
> The idea of taking a screenshot of the terminal and then parsing that to determine the true colour support is definitely novel,

A better way to do this is to send `OSC 1 0 ; ? ST` (query foreground color), `OSC 1 1 ; ? ST` (background color), then `OSC 4 ; {n} ; ? ST` where {n} is the nth XTerm color.

See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-O...

tombh · 3 months ago
OMG really!? That link is blocked for me for some reason. If that OSC code is widely supported it's going to make things sooooo much easier.
tombh · 3 months ago
Thanks for trying it out. It looks like either your terminal or screenshotter isn't faithfully rendering the pure red marker column (it's needed for calibration in the parser). The red should be #ff0000, but the screenshot is using #ea3323. I've made a Github issue to keep track https://github.com/tattoy-org/tattoy/issues/98 If you can add more details it'd really useful, I'm sure there'll be more people like you.
mkesper · 3 months ago
Maybe that's night mode (or whatever your DE calls it)?
TheSilva · 3 months ago
I see you added then removed Windows from your Release plan:

https://github.com/tattoy-org/tattoy/issues/42

So, it is supported or not? Looks great by the way.

tombh · 3 months ago
Thank you.

Windows is supported, I've tested it in Windows Terminal and Powershell. I removed it that issue from the release plan because not all the subtasks are finished yet. And more broadly speaking I just haven't had much feedback from Windows users. For example I haven't managed to get GPU passthrough working in my Windows VM so haven't actually been able to test shaders yet.

globnomulous · 2 months ago
If you need Windows beta testers, I'd be happy to volunteer.
PeterStuer · 3 months ago
On which hypervisor?
pvg · 3 months ago
em-bee · 3 months ago
Tattoy manages its own scrollback buffer (like say `tmux` does), and so can therefore also provide its own scrollbar.

this raises two questions: doesn't every (gui) terminal do that?

what happens if i use tmux inside tattoy?

btw: do you have examples of light themes?

tombh · 3 months ago
Yes, every GUI terminal manages its own scrollback buffer. The reason that Tattoy and tmux have their own buffers is because they are essentially terminal emulators themselves. For instance a terminal emulator may have 10 tmux panes and it should of course be possible to view the history of each one. Tattoy manages its own scrollback because that's the only way to make the scrollback available programatically to other processes, like the minimap for example.

Interestingly Alacritty in the beginning didn't natively support scrollback because it wanted to hand-off that concern to multiplexers like tmux. So there's precedent for terminals emulators not having to support scrollback.

tmux should work fine in Tattoy, the only thing to be aware of is that Tattoy would then handle input, like for scrolling etc, so some events may not reach tmux, in which case you could make some custom tmux keybindings that Tattoy doesn't recognise. It's also worth noting that Tattoy recognises the so-called "alternate screen" state that tmux controls its host with. And in such cases Tattoy forwards scrolling events to the underlying process, like say the mouse scroll wheel.

I don't have any light theme examples yet. It should mostly just work though.

em-bee · 3 months ago
my first attempt at using a light theme with gnome-terminal gets me white on white either in the prompt or on the commandline itself. don't have time to debug that now though.

what i was wondering is how the scrollback of tattoy and tmux would interact. normally when you use tmux the terminals scrollback remains unused (which is why alacritty devs thought they don't need their own). but from how tattoy uses the scrollback, i feared that tmux would actually interfere with some tattoy functionality. that's what i am curious about.

sevensor · 3 months ago
I especially like the idea of evolving the protocol. Just because the text first ui is a great idea doesn’t mean we achieved perfection with ansi escape codes.
nerflad · 3 months ago
This is brilliant, thanks for making public and best wishes
otterpro · 3 months ago
I'd probably run cmatrix for looks or maybe htop on the background. Also, Rick-rolled in the screenshot.
msgodel · 3 months ago
It seems like what you really wanted was a streaming SVG renderer and not a VTE.

I kind of like that idea.

tombh · 3 months ago
How do you mean? I'm actually not a fan of terminal image protocols like Sixel and Kitty's image protocol. I value the constraints of only being able to use text. I feel that in some ways when we venture into real graphics the soul of the terminal is lost.
msgodel · 3 months ago
Maybe I'm confused, I guess this is more an aesthetic thing than a practical thing. I just see VTEs as a minimal UI API for software.