Console #88 -- Kitty, MVT, and React Spectrum
An Interview with Kovid of Kitty
Do you have 100+ browser tabs open right now?
Give your memory a boost with Heyday so that accidentally closing them doesn’t feel like the end of the world.
The Heyday browser extension is like cheat codes for your memory.
It automatically saves content you view and resurfaces it alongside your Google search results.
Not subscribed to Console? Subscribe now to get a list of new open-source projects curated by an Amazon engineer in your email every week.
Already subscribed? Why not spread the word by forwarding Console to the best engineer you know?
Kitty is a cross-platform, fast, feature-rich, GPU-based terminal.
language: Python, stars: 13247, watchers: 163, forks: 654, issues: 26
last commit: January 11, 2022, first commit: October 14, 2016
Mobile Verification Toolkit (MVT) is a collection of utilities to simplify and automate the process of gathering forensic traces helpful to identify a potential compromise of Android and iOS devices.
language: Python, stars: 6540, watchers: 182, forks: 555, issues: 19
last commit: January 11, 2022, first commit: July 16, 2021
react-spectrum is a collection of libraries and tools that help you build adaptive, accessible, and robust user experiences open-sourced by Adobe.
language: TypeScript, stars: 5958, watchers: 66, forks: 440, issues: 352
last commit: January 11, 2022, first commit: May 03, 2016
Want to make more money for your work? Let us find you a new, higher-paying job for free! We’ve already landed 2 Console readers direct first-round interviews. Sign up for The Console Career Service today! The benefits of signing up include:
Automatic first-round interviews
One application, many jobs (1:N matching)
Free candidate preparation service
New opportunities updated regularly
All roles, from PM to SWE to BizOps
High potential, venture-backed, and open-source opportunities
Even if you’re not actively looking, why not let us see what’s out there for you?
Sign up for free in less than 5 minutes👇
Hey Kovid! Thanks for joining us! Let’s start with your background. Where have you worked in the past, where are you from, how did you learn how to program, and what languages or frameworks do you like?
I have never worked anywhere. I started calibre, my other open source project while in grad school at Caltech and have worked full time on it ever since. Kitty is a side project for me. I learned to program when I was six years old because I didn’t want to mug up multiplication tables, so I wrote a program to print them out instead in BASIC on a ZX Spectrum + that my mother used to use for her thesis work. I program mainly in Python and C and Rapydscript (which is a language I develop to make programming in JS less painful).
What's an opinion you have that most people don't agree with?
Haha. I specialize in having opinions people don’t agree with :) In kitty, the most controversial is probably that terminal multiplexers are the devils’ gift to mankind.
What's the argument against them?
What is your favorite software tool?
Any Vim tips or tricks you can pass on?
Learn the vim language for editing text, it will be a paradigm change in how you view editing text.
If you could dictate that everyone in the world should read one book, what would it be?
A mythical book titled: “How you shouldn’t allow yourself to be dictated by random assholes like me”.
If you could teach every 12 year old in the world one thing, what would it be and why?
To learn to think for themselves.
Any ideas on how you'd go about teaching this?
I like the socratic method. Ask lots of questions, force people to think of answers and then confront the logical contradictions in their answers. However, this doesn’t really scale to mass education.
If I gave you $100 million to invest in one thing right now, where would you put it?
A foundation to fund the heroic work of as many open source developers working alone on critical software without any support (and no I am not one of them, I get plenty of support).
Anyone in particular you'd like to shout out here that does need the support?
The latest such project I came across was libxml2. It is used extensively in calibre and currently lacks a maintainer. While building calibre for Apple Silicon I realized this because Apple uses this library as a dependency in IOKit and apples version was conflicting with calibre's version causing crashes. In debugging the crash I found libxml2 is un maintained. It's used by all sorts of software both open and closed for parsing xml/html so is pretty critical infrastructure.
What are you currently learning?
To inline skate.
What inspired you to pick that up? What resources are you using to learn this?
I like to challenge myself to learn new things every few years. My last such exercise was teaching my self swimming. I go skating with my daughters so that's fun. As for how to learn it, I watched a couple of random youtube videos to get a basic idea, then strapped on some skates and pads and went out there and fell down a lot :)
How do you separate good project ideas from bad ones?
Mostly gut feel. The most important criteria are: a) how maintainable the feature will be by me in the future b) how desirable the feature would be for end users.
Why was Kitty started?
Because I was trying to switch from gvim to terminal vim and none of the terminal emulators at the time had the performance and features I needed to do that. Hell there weren’t even curly underlines in terminals ‘til kitty created them. https://sw.kovidgoyal.net/kitty/underlines/
Where did the name for Kitty come from?
KovId’s TTY and also the name is a tribute to my cat of nine years who went missing around that time (I drew the kitty logo for her)
Are there any overarching goals of Kitty that drive design or implementation?
Move the terminal ecosystem forward in a direction where more and more of my everyday tasks can be performed in a terminal
If so, what trade-offs have been made in Kitty as a consequence of these goals?
I endure lots of abuse from opinionated people with stupid ideas who don’t like it when I point out their ideas are stupid. :) I guess that’s not a tradeoff. I can’t actually think of any software trade-offs in service of that goal. I don’t subscribe to the school of thought that says adding features to a product is somehow bad. That’s a pretty defeatist attitude.
What is the most challenging problem that’s been solved in Kitty, so far?
The challenges in this space aren’t really technical, mostly social. The most interesting technical challenge was coming up with the initial idea to render on the GPU. It was not at all clear at the time that doing so would make such a big difference to performance. At a personal level, teaching myself OpenGL while developing kitty was a challenge. Code complexity wise, getting the various font renderers (freetype and coretext) to render text one cell at a time so that the textures can be cached on the GPU while still supporting things like ligatures was fairly involved, but mostly to deal with all the corner cases, not algorithm wise.
Do you have any code references for this caching, or does OpenGL handle this for you?
No, OpenGL doesn’t do it for you, you have to implement it manually. It's a pretty standard technique for drawing text on GPUs. Just google sprite atlas and OpenGL. The cool part in kitty is that the sprite atlas is dynamically generated as needed, whereas in most gpu programs it is pre-rendered and packed as an "asset". The other cool thing in kitty is that every cell is rendered in parallel whereas most gpu text rendering does line-at-a-time. The relevant code in kitty is mostly in shaders.c search for sprite.
Are there any competitors or projects similar to Kitty? If so, what were they lacking that made you consider building something new?
None, kitty is sui generis :) Definitely was at the time it was started. Nowadays, I would say the project that comes closest to it is WezTerm.
What was the most surprising thing you learned while working on Kitty?
Just how performant it is possible to get if you simply code thoughtfully. I had no idea kitty’s performance would be so stellar. It wasn’t even a goal when I started, I just decided to use algorithms that didn’t throw away performance needlessly, and the end result of that was pretty surprising to me.
What is your typical approach to debugging issues filed in the Kitty repo?
I have been doing open source bug triage for almost twenty years now. I average about 50 pieces of user communication a day, everyday, 365 days a year. I have developed pretty good instincts for what is a bug and what isn’t thanks to that experience. I mostly rely on these.
And my main principle when doing bug triage is “Jo kal karna so aaj karna, jo aaj karna so abh”. A quote from Kabir that means: “What you have to do tomorrow, do today, what today, do now”. So I try to fix every bug within a few days at most. I succeed with 99% of them. And that keeps me sane.
What is the release process like for Kitty?
./publish.py and ten minutes later, done.
How do you intend to monetize Kitty?
Just by donations/patronage. I make an excellent living with that model from calibre already. Kitty is more niche so I doubt it will get to the same level, but who knows, when I started calibre I thought it would fund a pizza a week for me.
Any tips or tricks for others on how you managed to get enough people to donate to calibre to sustain yourself?
Work on an end user product, preferably one with a potential audience of at least a few million people. Make it cross-platform, and relatively easy to install/use. Work on documentation create demo videos, build a community around the product, work extremely hard at doing user support.
How do you balance your work on open-source with your day job and other responsibilities?
Open source is my day job :)
Do you think any of your projects do more harm than good?
What is the best way for a new developer to contribute to Kitty?
Read https://sw.kovidgoyal.net/kitty/build/ to learn how to build from source. Then just submit a PR or if you need guidance getting started open a discussion or issue and ask for help.
If you plan to continue developing Kitty, where do you see the project heading next?
I have To Do list for kitty that stretches to the moon. The terminal ecosystem has stagnated for sooooooo long. Lots and lots of low hanging fruit.
Top 3, maybe?
Adding support for arbitrary length unicode sequences in a single cell and incidentally reducing the average memory consumption per cell which should improve performance further. This will indirectly eventually allow displaying images even through tty programs that don’t support them. And someday make it possible to have different sized text in terminals.
Implementing a remote persistence daemon in kitty, this is the last thing missing to entirely replace terminal multiplexers.
Implementing support for transferring files over a tty directly. This is actually already done in master, but needs polishing/testing/releasing.
What motivates you to continue contributing to Kitty?
It’s fun and since I use it myself, I can pretend I am being productive :)
Are there any other projects besides Kitty that you’re working on?
The main one, my “day job” is, of course, calibre. Other than that I have half a dozen other open source projects I work on.
Where do you see software development heading next?
Nowhere :) I see only incremental changes in the future of software development.
Do you have any suggestions for someone trying to make their first contribution to an open-source project?
Find some software you use a lot and have some ideas to improve. Join the community of that software and help out in simple ways like bug triage or helping people new to the software and then discuss your ideas and send PRs. You can of course go straight to sending PRs but this way you are more likely to be taken seriously.
What is one question you would like to ask another open-source developer that I didn’t ask you?
No questions, just a big thank you for all the work you do to make the world a better place.