Show HN: Shitty – fast terminal. Memory-unsafe and faster than yours
Posted by pshirshov 21 hours ago
Comments
Comment by 3eb7988a1663 19 hours ago
I am not sure how many Moby Dicks I require per second, but it is good to have options.
Comment by nine_k 18 hours ago
Comment by tdeck 14 hours ago
Comment by the_onion_hater 1 hour ago
Comment by Bulat_Ziganshin 12 hours ago
Comment by genxy 19 hours ago
Comment by actionfromafar 19 hours ago
Comment by tosti 18 hours ago
Comment by mitchellh 16 hours ago
I don't know if it'd be faster than your terminal or not, but it'd be significantly faster than 1.3.1. On my M4 MacBook Pro, ASCII processing improved by about 2.8x, if that holds in your benchmarks, it would be faster than shitty. But, who knows. I'd prefer you ran it yourself.
Comment by sejje 14 hours ago
Comment by pg83 12 hours ago
Comment by pg83 12 hours ago
Comment by lr1970 9 hours ago
Comment by yjftsjthsd-h 20 hours ago
That conflicts with the already existing suckless st.
Also I am suitably impressed with the perf numbers, but I also somewhat take away that I could stick with (at least) alacritty or ghostty and not be much slower.
Comment by pg83 20 hours ago
Comment by zamadatix 2 hours ago
Comment by eru 16 hours ago
Comment by functionmouse 20 hours ago
on the other hand what gives them the right to st but not you?
Comment by account42 11 hours ago
Distributions. They'll probably rename one or the other so that they can be installed in parallel.
Comment by zamadatix 2 hours ago
Comment by voakbasda 20 hours ago
Comment by jcelerier 18 hours ago
that's really something that cannot be done if you don't have the original right of the code. It's 100% derived work and thus has to preserve GPL license, even if you rewrite every single line.
Comment by pg83 17 hours ago
The procedure described has been done many times, is well described, and is quite feasible, albeit quite complex.
I think I can handle it!
And, in any case, anyone who wants to can sue me in a real court, not an online one.
Comment by pg83 17 hours ago
Comment by potamic 13 hours ago
Comment by pg83 12 hours ago
Comment by fwlr 15 hours ago
Comment by tdeck 14 hours ago
Comment by rdslw 2 hours ago
Honestly I do not understand those last ten years craziness about 'new-native-gpu-turbo-ultra-xhigh-max-terminal' <insert current trend here>.
(my) battle tested urxvt under X11 is STILL faster then shitty (and all others):
## ascii (95 MiB cat, best wall of 3)
| terminal | wall | user | sys | throughput | |---|---|---|---|---| | urxvt | 0.78s | -s | -s | ~122 MiB/s |
Comment by p1necone 19 hours ago
Comment by pg83 19 hours ago
Furthermore, on Linux, I reuse buffers from the swapchain after the wayland compositor returns them, and I only update the areas that changed after I sent the buffer to the window system. In other words, I'm provably doing the minimum amount of work possible. Unfortunately, this isn't possible on MacOS, since the Metal documentation states that it can (and does) corrupt a buffer while displaying it.
Basically, based on code, not actual measurements, shitty is the best terminal in terms of change delivery latency.
Comment by grg0 18 hours ago
That is a very bold claim to make for the amount of render code generated by the LLM. It's not obvious what the critical path even is, which is what would bound the latency. And I mean actual code, not just some informal description of what happens.
Comment by pg83 18 hours ago
Comment by mrtesthah 4 hours ago
Comment by cyanregiment 20 hours ago
I'm glad you guys are out there - someone has to do it.
Comment by cocacola1 16 hours ago
Comment by cyanregiment 16 hours ago
Good for you Ian, happy guy.
I gotta say though: https://www.fieggen.com/shoelace/knots.htm
Most of these look like dogshit.
Feel like I would be tripping over my own feet lookin like a shipwreck.
This one is bullshit, he's padding content: https://www.fieggen.com/shoelace/startknot.htm That's not a knot. Not a knot.
That's the beginning of tying your shoes.
Come on Professor!
Comment by Nursie 15 hours ago
Comment by butterisgood 19 hours ago
Comment by cyanregiment 19 hours ago
They also count my steps.
(also I had to look up aglet)
Comment by defrost 14 hours ago
Comment by egeuvuvy6 19 hours ago
Fuck nvm btw.
Comment by cyanregiment 18 hours ago
It matters!
There is some number of fps where "the human eye can't tell the difference" I bet there is one for ms delays
Comment by chowells 14 hours ago
Comment by cyanregiment 7 hours ago
When we learn something well we model it thoroughly and notice the tiniest change
Comment by entrope 13 hours ago
Comment by cyanregiment 7 hours ago
Comment by joncp 19 hours ago
I do wonder, however, whether people really have issues with perf on any terminal emulator in 2026
I’ve been living in Terminal.app / zsh / tmux / vim for 15 years and have never once thought “this is slower than I want.”
Comment by marvinborner 19 hours ago
Comment by christophilus 17 hours ago
Comment by boltzmann64 19 hours ago
Comment by Evidlo 19 hours ago
Comment by skydhash 18 hours ago
Comment by porridgeraisin 15 hours ago
xfce4-terminal starts utterly instantly without single instance feature.
Kitty has the single instance feature and starts instantly with it.
Comment by pg83 19 hours ago
Comment by bityard 8 hours ago
I ask this question often in the comments when a new "blazingly fast" terminal is announced and after years of doing so, have yet to read an actually practical answer that applies to modern systems.
My guess is that some people just enjoy the process of optimizing well-understiod low-stakes graphical stuff.
Comment by thayne 19 hours ago
However, there is one case when throughput matters: when an application has a lot of output. But then the problem isn't the speed that it displays the text, it's going by too fast to read anyway, the problem is that the application can be slowed down by blocking on writing to stdout when the buffer is full. And honestly, the best approach in that case is probably not to actually render all the text, but send most of the output straight to the scrollback buffer, and only render some of the frames.
Comment by krackers 19 hours ago
Comment by pjmlp 13 hours ago
Now graphical nicely powered REPL environments is another matter.
Comment by aqula 14 hours ago
Comment by wavemode 17 hours ago
Comment by pjmlp 13 hours ago
Comment by mellosouls 19 hours ago
I'm all for vulgar wit but this isn't that (yes I'm aware of the -tty convention) & just reinforces the cliche of tech skills inversely proportional to social ones
Comment by platinumrad 17 hours ago
This might not be something the author cares about. Compliance with corporate policies is certainly not something I've prioritized when giving away open source software for free.
Comment by wmf 16 hours ago
Comment by pg83 19 hours ago
- we have 5,000 tests covering all aspects of terminal behavior
- we have address sanitizer and ub sanitizer runs of these tests
- we also have regular fuzzing!
- we even monitor code coverage
This is definitely a top 0.1% GitHub project in terms of development approach.
> and neither will it help with getting it installed on corporate networks.
I'm fine with it.
Comment by gertop 15 hours ago
Shitty is almost 100% generated by AI, tests and all. Is that really what you see as the epitome of development? Enough that you self rank in top 0.3%?
Comment by naikrovek 18 hours ago
Comment by pg83 18 hours ago
Comment by queenkjuul 9 hours ago
Comment by EPWN3D 18 hours ago
Comment by mellosouls 18 hours ago
Comment by pg83 18 hours ago
It's quite obvious to me that professionalism in product manufacturing correlates very weakly with naming :) Proof me wrong.
Comment by naikrovek 18 hours ago
Any sales or marketing person will gladly tell you how bad an idea it is to use this name. “Shitty” is slang for “terrible quality”, for one.
Comment by potamic 14 hours ago
Comment by krautburglar 16 hours ago
Comment by quotemstr 19 hours ago
Comment by mellosouls 19 hours ago
It's partly frustrating because the laziness of the naming presumably doesn't actually reflect the effort that has gone into the project.
Comment by sublinear 19 hours ago
Your appeals to authority do not apply when the author is clearly telling you not to use it for that. We're well past the point where this kind of software eventually ends up under corporate use policy or any policy at all.
Comment by mellosouls 19 hours ago
Comment by 1bpp 18 hours ago
Comment by mellosouls 18 hours ago
Comment by Barbing 20 hours ago
With this you can DuckDuckKagi for the crappy terminal (versus “CRM crm”… ah guess they wanted you to remember their company name)
Comment by al_borland 20 hours ago
https://github.com/fearlessgeekmedia/shiTTY
This one just tried to reserve the name with an empty repo a year ago... probably where the LLM got the name.
Comment by moderation 3 hours ago
Comment by egeuvuvy6 19 hours ago
I can't use half of the terminal emulators because theyre so slow that after hitting my key bind to open them and I start typing half of the first word is missing.
Comment by pg83 19 hours ago
Comment by mrwaip 3 hours ago
Comment by tulio_ribeiro 19 hours ago
Later, Microsoft fixes the issue but fails to give Muratori credit. After backlash, they went back and gave him a footnote: https://devblogs.microsoft.com/commandline/windows-terminal-... (atlas release section)
GitHub thread in question: https://github.com/microsoft/terminal/issues/10362#issuecomm...
And this gem: https://github.com/microsoft/terminal/issues/10362#issuecomm...
Comment by sgarland 19 hours ago
Comment by 3eb7988a1663 18 hours ago
Comment by butterisgood 19 hours ago
Comment by pg83 19 hours ago
Comment by quotemstr 19 hours ago
The author of shitty encoded the whole terminal state machine in Ragel: https://github.com/pg83/shitty/blob/master/parser.rl
The thing generates one of big DFA with actions for everything that can ever happen in the terminal. Precisely correct way to do it. Plus, Ragel is a joy to program once you get the hang of it. You can compose edge-triggered, level-triggered, and recursive operators in surprisingly elegant ways.
Comment by pg83 18 hours ago
Comment by fishgoesblub 19 hours ago
An interesting, and disappointing choice. Shitty, one may say.
Comment by naikrovek 18 hours ago
Forcing someone to release their code for free isn’t freedom, that’s a lack of freedom. Oh, you want the code to be free. Well guess what? MIT licensed means you can have it. Oh, you want a third party’s changes to be made free. No. Expecting that is batshit insane.
If someone forks this, changes it, and doesn’t release their changes, this still exists. Nothing is lost.
When something is released under MIT, it is “released”. When GPL software is released, it “binds” anyone that works on it, adding requirements to the entity doing the work. I.e. not free.
Comment by teo_zero 14 hours ago
There is a trait in human nature that pushes us to share our knowledge. But we would like this sharing to be mutual.
When I publish a piece of software for free, I would like others to read it, comment it, give me suggestions on how to make it better, and the whole community can benefit from the process.
Unfortunately, someone might instead take it, start making profit out of it, and never giving anything back to me or the community.
As a device to get the former effect and avoid the latter, a sort of "contract" was created that mimicks a copyright licence. It is called copyleft and says that you can do whatever you want with my work except profit.
Now, someone might say that stopping a third party from profiting out of something they have not made is correct, someone might say it nevertheless means removing a freedom from them.
Whose side are you on?
Comment by oneshtein 15 hours ago
Comment by t0mpr1c3 16 hours ago
Comment by d3Xt3r 15 hours ago
Comment by pg83 12 hours ago
Comment by chamomeal 19 hours ago
Comment by naikrovek 18 hours ago
Like a neighborhood kid outside on his bike yelling “shit” then pedaling away as fast as he can, to dissociate himself from the event out of fear of getting caught.
FaTTY - Fast Terminal (executable named “ft”)
RaTTY - Rapid Terminal (“rt”)
LighTTY - Lightspeed Terminal (“lt”)
Dragster (“dt”)
McQueen (“mt”)
Names are hard, but it’s trivial to come up with a name better than “shitty”.
Comment by theturtletalks 20 hours ago
Comment by pg83 20 hours ago
Comment by mrwaip 3 hours ago
Comment by elitepleb 18 hours ago
Comment by grg0 19 hours ago
Comment by pg83 19 hours ago
Comment by grg0 19 hours ago
I just browsed the project for two minutes and it's one of the first things I noticed. std::thread is more portable (Windows, if anyone cares) and allows you to pass in a lambda, which keeps the code local and also has the compiler generate the closure for you instead of having to pass function pointers and void* captures around. I don't see any advantage to using pthread directly.
Comment by pg83 18 hours ago
Of course I looked at the LLM output, but people, uh, make mistakes and can miss something.
> std::thread is more portable (Windows, if anyone cares) and allows you to pass in a lambda, which keeps the code local and also has the compiler generate the closure for you instead of having to pass function pointers and void* captures around. I don't see any advantage to using pthread directly.
These are obvious things, and the objections to them are equally obvious. For example, std::thread is an additional level of abstraction over pthreads, which, in essence (not in form), gives me nothing. And I don't care about Windows, really.
Comment by quotemstr 19 hours ago
Comment by grg0 19 hours ago
Comment by bearead 19 hours ago
Comment by throwatdem12311 19 hours ago
Comment by pg83 19 hours ago
Comment by ddlsmurf 19 hours ago
Comment by pg83 19 hours ago
Comment by jitl 19 hours ago
this is not true on my machine, at least for my usual benchmark Doom-fire-zig[1]. on said benchmark, ghostty 1.3.1 runs at about 350fps, wezterm 20260713-212414-b3255666 runs at 415fps, Terminal.app runs at 100fps, iterm2 3.6.11 runs at 80fps.
Comment by collinvandyck76 19 hours ago
Comment by Null-Set 17 hours ago
Comment by pg83 12 hours ago
Comment by normie3000 20 hours ago
Comment by Retr0id 20 hours ago
(I have, also, thought about building my own perf-optimized terminal. It's a fun problem space!)
Comment by scuppernong 19 hours ago
Comment by tulio_ribeiro 19 hours ago
I would need to display roughly 70 GB of benchmark-equivalent ASCII output before Shitty recovers a five-minute switching cost relative to GNOME Terminal.
This assumes I’m actively blocked by every byte being rendered.
Comment by kelnos 19 hours ago
Regardless, sometimes you just gotta write some code because there's an itch that needs to be scratched. Sounds like this author really wanted to see if he could write a super fast terminal, and make one faster than the incumbents. It's a cool achievement!
Comment by jcelerier 18 hours ago
wild
Comment by pg83 20 hours ago
Comment by y1n0 20 hours ago
My main complaint with ghostty is the crappy configuration.
Comment by pg83 19 hours ago
Comment by protocolture 19 hours ago
Comment by eigrad 10 hours ago
Comment by jmyeet 19 hours ago
1. Don't call your project "shitty". At best it's juvenile humor. At worst, it's going to make adoption within companies difficult for literally no reason; and
2. You don't need a two letter command. I'm sorry but you're not that special. Your tool should instead denote its purpose with its name. In this case something like "sterm" or "stty" would do that perfectly without being verbose.
Comment by Rohansi 19 hours ago
I wouldn't want to work somewhere like that. Trying to pretend that people don't swear is just dumb. It's not even offensive.
Comment by kelnos 19 hours ago
I thought it was quite clever, and was surprised I hadn't thought of it (given the prevalence of "tty" puns like kitty and ghostty).
But I'm a 14 year old boy living in a 45 year old body, so I can't get enough juvenile humor. A friend of mine with similar taste in humor once said, "if I ever stop finding this stuff funny, put me in the ground", and I still wholeheartedly agree with the sentiment.
(For example: whenever I need a quick scratch file to put some text in, I call it "shits", because then I can type "cat shits" and giggle inside my head. I'm also have cats, so I deal with cat shits daily.)
> You don't need a two letter command. I'm sorry but you're not that special.
This I agree with, though perhaps in a politer way.
Regardless, though... live and let live? The existence of this doesn't harm you an any way, and your judgey moralizing is a bit much.
Comment by porridgeraisin 15 hours ago
Comment by compiler-devel 19 hours ago
Comment by potamic 14 hours ago
Comment by myshapeprotocol 19 hours ago
Comment by h0mie 20 hours ago