WEBVTT

00:00:00.000 --> 00:00:02.740
And then people were like, well, this doesn't work in tmux, and

00:00:02.740 --> 00:00:05.320
it doesn't work in WeChat, and it doesn't work in vim.

00:00:05.420 --> 00:00:06.600
And I'm like, what the hell?

00:00:07.000 --> 00:00:10.840
And then my next windmill that I'm looking at is variable-sized

00:00:10.840 --> 00:00:11.680
text in the terminal.

00:00:12.800 --> 00:00:16.240
So when I'm catting a markdown file, I want to see the headings big and.

00:00:17.240 --> 00:00:20.320
Like in emacs, right? Yes, yes.

00:00:20.460 --> 00:00:22.840
So why should only emacs user benefit.

00:00:23.440 --> 00:00:26.640
Like Rio, for example, is a new terminal out there.

00:00:26.640 --> 00:00:32.080
So it can adopt the kitty graphics protocol and use it, right? Yes, absolutely.

00:00:32.200 --> 00:00:34.140
I encourage everyone to adopt it.

00:00:34.400 --> 00:00:35.380
There's an open spec.

00:00:35.600 --> 00:00:40.640
It's using kitty to replace the file open dialogs in Linux.

00:00:40.980 --> 00:00:43.980
You say file, save page as.

00:00:44.300 --> 00:00:47.240
Here you see there's actually a kitty instance that's running

00:00:47.240 --> 00:00:48.900
a file choosing kitten.

00:00:49.440 --> 00:00:52.480
Because ebook readers are a big boom for elderly people because

00:00:52.480 --> 00:00:53.940
you can make the font size bigger.

00:00:54.640 --> 00:00:56.260
In fact, I do that myself.

00:00:57.240 --> 00:00:58.840
I don't know if you can see this on the screen.

00:00:59.480 --> 00:01:03.260
Yeah, as I age, my eyes have gotten weaker.

00:01:03.480 --> 00:01:06.340
And so I don't like to wear specs when reading on my Kindle.

00:01:06.480 --> 00:01:07.720
So I make the font size big.

00:01:08.400 --> 00:01:11.920
Do you ever get in trouble with kitty because of the language

00:01:11.920 --> 00:01:13.560
that you decided to use Python?

00:01:13.800 --> 00:01:18.560
Since we hear every, you know, nowadays everyone is like, rust,

00:01:18.880 --> 00:01:21.640
rust, rust, you just hear that everywhere, right?

00:01:23.840 --> 00:01:25.760
Um, I have a tough one for you.

00:01:25.840 --> 00:01:26.880
I have a good question.

00:01:26.880 --> 00:01:32.440
You want to see, let me grab your water first. Yep. Yep.

00:01:32.440 --> 00:01:35.500
So you mentioned that we briefly talked about it.

00:01:35.500 --> 00:01:38.480
I think you know what I'm going to ask probably, right?

00:01:38.840 --> 00:01:41.040
So what are your thoughts on tmux?

00:01:41.500 --> 00:01:47.100
Oh, I, do you talk to the tmux maintainer for compatibility?

00:01:47.100 --> 00:01:51.060
When you try to deploy something new, do you have communication?

00:01:51.500 --> 00:01:52.160
What's his name?

00:01:52.380 --> 00:01:53.880
Um, I don't remember his name.

00:01:56.180 --> 00:01:58.820
Um, I did try, but he wasn't interested.

00:01:59.760 --> 00:02:01.020
So I don't anymore.

00:02:01.700 --> 00:02:03.820
Your main IDE, which one is it?

00:02:04.940 --> 00:02:06.340
It's, uh, it used to be vim.

00:02:06.580 --> 00:02:08.060
Now it's, now it's neovim.

00:02:08.480 --> 00:02:10.420
So you can see this is a kitty file inside neovim.

00:02:11.020 --> 00:02:14.100
If you're listening to this as a podcast, remember that it was

00:02:14.100 --> 00:02:15.360
originally recorded as a video.

00:02:15.580 --> 00:02:17.900
If you're not following along, you can go to my YouTube channel.

00:02:18.140 --> 00:02:19.400
My username is Linkarzu.

00:02:19.820 --> 00:02:22.420
And if you want to support me to keep this podcast going, you

00:02:22.420 --> 00:02:23.680
can donate in Ko-fi.

00:02:24.180 --> 00:02:26.400
I'm going to leave a link in the description. All right.

00:02:26.400 --> 00:02:28.280
So let's get started with this chapter then.

00:02:29.460 --> 00:02:34.900
I have a special guest today, Kovid, which we all know is the

00:02:34.900 --> 00:02:36.100
creator of the Kitty Terminal.

00:02:36.300 --> 00:02:40.140
And I didn't know that you're, you're also the creator of another

00:02:40.140 --> 00:02:42.740
application called Calibre, right?

00:02:43.620 --> 00:02:46.360
Yes, in fact, Calibre is my main job.

00:02:46.620 --> 00:02:49.900
Kitty is my hobby. Oh, okay.

00:02:50.060 --> 00:02:51.660
So Calibre is the main one.

00:02:51.660 --> 00:02:54.640
So really appreciate you being here, Kovid.

00:02:55.340 --> 00:02:57.640
Really, really, you know, big fan of Kitty.

00:02:57.820 --> 00:03:01.800
So thank you very much for joining us and talking about your tools today.

00:03:02.100 --> 00:03:03.100
How's it going, by the way?

00:03:03.640 --> 00:03:04.140
It's very good.

00:03:04.360 --> 00:03:05.460
Thank you for having me.

00:03:06.340 --> 00:03:07.700
I'm looking forward to a fun chat.

00:03:08.640 --> 00:03:10.860
So what do you want to start with?

00:03:11.440 --> 00:03:12.720
How did it all get started?

00:03:12.960 --> 00:03:15.980
That's the first thing I want to know, because I thought, you

00:03:15.980 --> 00:03:17.780
know, that Kitty was the main thing.

00:03:17.820 --> 00:03:19.340
And I was like, okay, Kitty.

00:03:19.340 --> 00:03:24.960
And I went into your profile, to your website, and then I saw Calibre.

00:03:25.300 --> 00:03:26.980
And I was like, Calibre.

00:03:27.100 --> 00:03:29.200
I have seen that somewhere.

00:03:29.440 --> 00:03:31.840
It's something related to books, right?

00:03:32.380 --> 00:03:33.920
So I'll tell you the history.

00:03:35.500 --> 00:03:38.780
So I'm a big, personally, I'm a big reader of books.

00:03:39.120 --> 00:03:40.740
So I read like a hundred books a year.

00:03:40.760 --> 00:03:41.960
And I've been doing that all my life.

00:03:43.060 --> 00:03:47.840
So at some point, I was a grad student in the US at Caltech.

00:03:49.340 --> 00:03:53.740
And there, in the neighborhood, there were no good libraries with fiction books.

00:03:54.520 --> 00:03:57.520
And I was too poor to buy my own books at the time.

00:03:57.900 --> 00:04:03.940
But what I did have was a real MyTech Neo GPS navigation device.

00:04:04.960 --> 00:04:09.120
And so I used to get books from the internet, various places,

00:04:09.420 --> 00:04:11.800
convert them to text files, and read them on that device.

00:04:12.220 --> 00:04:15.000
So that was my first experience with e-books.

00:04:16.060 --> 00:04:20.820
So then, around 2006, I was still at Caltech, still a grad student,

00:04:21.200 --> 00:04:22.940
still a lot of time on my hands.

00:04:23.180 --> 00:04:27.360
And Sony released the first e-ink-based reader in the US.

00:04:28.080 --> 00:04:29.140
It was a PRS-500.

00:04:29.420 --> 00:04:32.020
So immediately, the day after it was released, I went and bought

00:04:32.020 --> 00:04:34.280
it, and I brought it home with me.

00:04:34.480 --> 00:04:35.940
And so I tried to use it.

00:04:36.460 --> 00:04:40.440
Unfortunately, Sony had a proprietary USB protocol.

00:04:40.860 --> 00:04:41.960
It didn't, it did.

00:04:42.040 --> 00:04:44.760
But nowadays, all readers connect either using the NTP protocol

00:04:44.760 --> 00:04:46.820
or the USB mouse-to-mouse device protocol.

00:04:47.380 --> 00:04:49.820
Just standardized, and there were tools to interact, libraries

00:04:49.820 --> 00:04:50.960
to interact with, and so on.

00:04:51.200 --> 00:04:53.920
But at that time, Sony had its own proprietary USB protocol.

00:04:54.920 --> 00:04:57.300
And so I couldn't get the device to connect to my linux computer.

00:04:57.820 --> 00:04:59.980
I had to use Sony's proprietary software.

00:05:00.320 --> 00:05:03.320
I mean, I don't remember now, but I think I got it either on the

00:05:03.320 --> 00:05:06.180
VM or on a Windows computer or something.

00:05:06.760 --> 00:05:10.540
But anyway, so I decided that, let me, since I know how to program,

00:05:12.280 --> 00:05:15.500
and I have some spare time, let me try to reverse-engineer it

00:05:15.500 --> 00:05:16.760
and get something working.

00:05:17.280 --> 00:05:20.980
So I found this website called mobileread.com, which I'm still

00:05:20.980 --> 00:05:21.560
a member of.

00:05:21.740 --> 00:05:23.660
There were a lot of people there, hanging out who were interested

00:05:23.660 --> 00:05:25.060
in the books to read.

00:05:26.260 --> 00:05:29.280
And so with the help of some people there, I remember, in particular,

00:05:29.820 --> 00:05:35.360
one guy from Russia named Igor, I ended up sort of reverse-engineering

00:05:35.360 --> 00:05:37.020
the USB protocol.

00:05:37.220 --> 00:05:40.720
So I used a tool to dump the actual package that the device would

00:05:40.720 --> 00:05:44.180
send in response to commands when using the Sony software.

00:05:44.780 --> 00:05:48.420
But I printed these out on paper, I mean, on U.S. letter sheets

00:05:48.420 --> 00:05:49.820
of paper, since I was in the U.S.

00:05:50.380 --> 00:05:53.680
And I would take them with me to lunch, and lunch was kind of

00:05:53.680 --> 00:05:54.540
a complete time for me.

00:05:54.560 --> 00:05:58.380
So I would just sit and eat my lunch and put all those cases of

00:05:58.380 --> 00:06:00.320
USB packets and try to reverse-engineer things.

00:06:00.680 --> 00:06:02.720
So anyway, I managed to reverse-engineer things with a lot of

00:06:02.720 --> 00:06:07.560
help, and I released a software, something called libprs500, a

00:06:07.560 --> 00:06:08.620
classic open source name.

00:06:09.820 --> 00:06:15.100
And so anyway, a lot of people were very happy to have that thing

00:06:15.100 --> 00:06:16.240
and got a bit of popularity.

00:06:16.460 --> 00:06:20.480
So I decided to write a GUI for it, just to, you know, front-end

00:06:20.480 --> 00:06:22.920
and add the ability.

00:06:23.160 --> 00:06:25.700
So Sony also, apart from the proprietary USB protocol, they also

00:06:25.700 --> 00:06:30.300
had their own e-book format called LRF, which was again proprietary

00:06:30.300 --> 00:06:32.020
and not documented and blah, blah, blah.

00:06:32.220 --> 00:06:35.720
So again, with the help of some people who had written some Python

00:06:35.720 --> 00:06:40.680
code to convert to parse the LRF format and convert to this one,

00:06:41.160 --> 00:06:44.600
I adapted that code and improved it and integrated it into libprs500

00:06:44.600 --> 00:06:48.700
and added a basic GUI just so you can connect your device and

00:06:48.700 --> 00:06:50.100
click on buttons to send books to it.

00:06:50.260 --> 00:06:51.020
It's that kind of thing.

00:06:51.500 --> 00:06:54.740
So that was the start of what eventually became Calibre.

00:06:55.240 --> 00:06:58.240
So for a couple of years, I just kept doing that.

00:06:58.560 --> 00:06:59.980
I would do these things every few days.

00:07:00.200 --> 00:07:05.800
I'd fix new things, find new bugs, whatever, get all enthusiastic users.

00:07:05.800 --> 00:07:10.320
So at some point I decided, okay, let me put out a donate button

00:07:10.320 --> 00:07:11.120
for this thing.

00:07:11.780 --> 00:07:13.160
Maybe I'll get a pizza, I'll be good.

00:07:14.160 --> 00:07:17.580
So I put out a donate button on the download page for libprs500.

00:07:18.160 --> 00:07:20.620
I think it used to run on something called Track at the time,

00:07:20.780 --> 00:07:21.940
which was a tippeting system.

00:07:22.460 --> 00:07:24.180
So I'm on the front page of that.

00:07:24.820 --> 00:07:27.480
So then I started getting a lot more money than I expected.

00:07:28.080 --> 00:07:29.640
People were supporting me.

00:07:31.740 --> 00:07:33.640
I was surprised.

00:07:34.340 --> 00:07:39.720
And so then around 2008, which is when I got married, I also decided

00:07:39.720 --> 00:07:44.420
to change the name of libprs500 to Calibre and spruce it up a

00:07:44.420 --> 00:07:48.620
bit and release it, make it available for Windows and Mac OS as well.

00:07:49.840 --> 00:07:53.620
And sort of, you know, well, spend a little more time than I thought I did.

00:07:54.020 --> 00:07:55.160
And so I did that.

00:07:55.200 --> 00:07:58.460
And then I graduated a couple of years after that, I think.

00:07:59.560 --> 00:08:02.140
Maybe a year after that, I don't remember exactly now.

00:08:02.140 --> 00:08:04.780
And so after graduating, I was supposed to go for a postdoc.

00:08:05.020 --> 00:08:10.540
But then my wife and I were both theoretical physics PhDs.

00:08:11.660 --> 00:08:15.240
And so one of the things, one of the things, one of the problems

00:08:15.240 --> 00:08:17.060
with that is that it's very difficult to get a job at the same

00:08:17.060 --> 00:08:18.760
place as a postdoc.

00:08:19.500 --> 00:08:22.480
Very rarely opportunities open up in the same place at the same time.

00:08:22.760 --> 00:08:24.840
So, you know, we wanted to stay together, obviously.

00:08:25.080 --> 00:08:28.480
We'd already been apart for, like, several years as gas students.

00:08:29.980 --> 00:08:31.000
And so we wanted to stay together.

00:08:31.000 --> 00:08:34.640
So I said, let me take a sabbatical from physics after graduating

00:08:34.640 --> 00:08:39.360
from Caltech and spend a year or two working on Calibre full-time

00:08:39.360 --> 00:08:40.120
and see how it goes.

00:08:40.420 --> 00:08:42.620
And, you know, I'll move to wherever she's going.

00:08:43.600 --> 00:08:46.100
Just stay with her and work on Calibre from home.

00:08:46.740 --> 00:08:47.340
So that's what I did.

00:08:47.520 --> 00:08:51.680
It was actually quite a, you know, hard process was I had to apply

00:08:51.680 --> 00:08:55.420
for a visa that allowed me to do work while being a dependent.

00:08:56.820 --> 00:08:58.120
Those were some pretty tough months.

00:08:58.440 --> 00:09:01.300
But anyway, so it all worked out and I got my visa and I spent

00:09:01.300 --> 00:09:03.440
a year or two working on Calibre full-time.

00:09:04.000 --> 00:09:06.920
And that was around the time Amazon came out with this Kindle

00:09:06.920 --> 00:09:08.580
and the e-book market where we took off.

00:09:08.640 --> 00:09:12.700
So if you look at our history of activity in Calibre, you see

00:09:12.700 --> 00:09:17.340
around 2010, 2011 is kind of the peak amount of activity.

00:09:17.640 --> 00:09:21.740
And so those were the years when Calibre was really growing.

00:09:21.900 --> 00:09:24.700
And now it's grown to, you know, has about 3 million users and

00:09:24.700 --> 00:09:26.340
it's using over 200 contributors

00:09:26.980 --> 00:09:29.240
It does everything you would ever want to do with an e-book.

00:09:29.240 --> 00:09:32.240
Read it, convert it, edit it.

00:09:32.380 --> 00:09:34.720
You can basically do whatever you want with it.

00:09:35.520 --> 00:09:38.900
In fact, you can send it to 50 different devices.

00:09:39.760 --> 00:09:42.420
There's a content server that allows you to browse your e-book

00:09:42.420 --> 00:09:44.560
collection over the net and so on.

00:09:44.960 --> 00:09:46.240
It's got an insane number of features.

00:09:47.480 --> 00:09:49.860
So anyway, so that was how Calibre started.

00:09:50.240 --> 00:09:56.800
And then coming to Kitty about 9 or 10 years ago, I think, I was

00:09:56.800 --> 00:09:59.340
dissatisfied with the speed of gvim.

00:09:59.740 --> 00:10:01.940
So I was using gvim as my editor at the time.

00:10:02.120 --> 00:10:03.420
And I was dissatisfied with its speed.

00:10:03.500 --> 00:10:08.340
I don't remember exactly what the issue was, but I was dissatisfied

00:10:08.340 --> 00:10:08.920
with the speed.

00:10:09.540 --> 00:10:12.040
I wanted to make it faster.

00:10:13.760 --> 00:10:17.000
And so then I thought, let me try Terminal again.

00:10:17.260 --> 00:10:20.460
Terminal is supposed to be low overhead, not loaded, blah, blah, blah.

00:10:20.820 --> 00:10:22.200
At the time, I didn't know much about Terminals.

00:10:22.200 --> 00:10:27.420
So when I tried that, it didn't make much of a difference in the speed.

00:10:28.220 --> 00:10:30.520
And so then I started... benchmarking Terminals, and I found that

00:10:30.520 --> 00:10:34.320
there were, at the time, at least the leading Terminals were all pretty slow.

00:10:35.040 --> 00:10:37.220
So I said, you know, I can possibly do better.

00:10:38.100 --> 00:10:39.600
And it'll be a fun side project.

00:10:40.240 --> 00:10:41.100
That's how I started kitty.

00:10:43.000 --> 00:10:46.080
So, you know, Calibre was mostly written in Python.

00:10:46.700 --> 00:10:49.160
It's actually got three or four different languages, but mostly in Python.

00:10:49.480 --> 00:10:52.500
So I started kitty in Python with the idea that I will make the

00:10:52.500 --> 00:10:56.400
front end and, you know, use a scriptable path in Python and backend

00:10:56.400 --> 00:10:59.000
would be in C. And OpenGL.

00:10:59.500 --> 00:11:00.360
And so that's what I did.

00:11:00.620 --> 00:11:02.640
I made it GPU accelerated.

00:11:03.520 --> 00:11:07.460
Actually, to start with, my first attempt was using Qt, which

00:11:07.460 --> 00:11:11.420
is the toolkit that I submitted from Calibre to do the actual

00:11:11.420 --> 00:11:13.340
rendering of the text on the screen.

00:11:13.440 --> 00:11:14.620
But that was just performance.

00:11:14.820 --> 00:11:16.920
I could not get it to a satisfactory level.

00:11:16.940 --> 00:11:19.940
So I decided to learn OpenGL, and at the time, I knew nothing

00:11:19.940 --> 00:11:21.980
about GPU programming at all.

00:11:22.040 --> 00:11:25.580
So I taught myself OpenGL and a little bit enough to, you know,

00:11:25.580 --> 00:11:26.400
just about fit.

00:11:27.180 --> 00:11:28.320
characters on the screen.

00:11:29.080 --> 00:11:30.540
And then that's how kitty was born.

00:11:30.700 --> 00:11:32.380
And I really, at that time, you know, it became popular.

00:11:33.140 --> 00:11:36.560
And, and then, and so then, so one of, so when I, so then I made

00:11:36.560 --> 00:11:41.660
the switch to terminal, terminal vim Sorry, that time it was vim

00:11:41.840 --> 00:11:44.040
Not, I don't know if I said neovim, but at the time I was using

00:11:44.040 --> 00:11:48.100
vim So I made the switch to terminal vim and there was one big problem.

00:11:48.640 --> 00:11:49.680
There were no colored underlines.

00:11:50.900 --> 00:11:54.880
At the time there was, yeah, there were no colored underlines.

00:11:54.960 --> 00:11:56.100
There were no undercurls, nothing.

00:11:56.100 --> 00:11:59.280
And I'd gotten used to that in gvim or whatever.

00:12:00.660 --> 00:12:03.700
And so I said, okay, let me, let me, let me come up with a protocol

00:12:03.700 --> 00:12:05.560
for this and, you know, make it happen in kitty.

00:12:05.780 --> 00:12:09.020
And it's a little bit of a blockade and it'll become, it'll become,

00:12:09.320 --> 00:12:09.820
I don't know.

00:12:10.120 --> 00:12:13.520
So I'll give them here someday, implement it and I'll have, I'll

00:12:13.520 --> 00:12:14.880
have colored underlines in my editor.

00:12:15.340 --> 00:12:16.320
So that's what I did.

00:12:16.320 --> 00:12:21.660
I made a protocol for colored and styled underlines in kitty and

00:12:21.660 --> 00:12:24.260
I released it and eventually it became popular.

00:12:24.260 --> 00:12:27.164
And today you have colored underline in your terminal thanks to

00:12:27.164 --> 00:12:30.060
me, which is the one thing I did what to credit for.

00:12:31.540 --> 00:12:35.120
So that was, so, so, so that was my start at, at sort of trying

00:12:35.120 --> 00:12:38.640
to extend the terminal capabilities because, you know, as I use

00:12:38.640 --> 00:12:40.900
the terminal more and more, I sort of found limitations.

00:12:41.640 --> 00:12:47.380
So one of the things that I used to do was run some numerics and,

00:12:47.400 --> 00:12:51.500
you know, I'd like to, I'd like to visualize the results.

00:12:51.980 --> 00:12:55.160
And I should run it, I should SSH into a server and run them.

00:12:55.900 --> 00:12:57.760
And it was painful to visualize the results.

00:12:58.100 --> 00:13:01.120
You know, you had to populate a file, a CP to file to your local

00:13:01.120 --> 00:13:03.900
computer and open it with the same module as SSHFS or whatever,

00:13:04.020 --> 00:13:05.920
some sort of, you know, hacky way.

00:13:05.960 --> 00:13:09.500
So I said, okay, let me, let me, let me make a graphics protocol

00:13:09.500 --> 00:13:10.000
for the terminal.

00:13:10.080 --> 00:13:14.180
So I can just, you know, cat a simple PNG image and just view it conveniently.

00:13:14.440 --> 00:13:15.660
So that was the start.

00:13:15.660 --> 00:13:19.540
But then once I, so once I started investigating the, you know,

00:13:19.540 --> 00:13:22.320
existing landscape was around and I found something called sixel,

00:13:22.580 --> 00:13:30.680
which is an ancient protocol for, for images that's existed from

00:13:30.680 --> 00:13:32.240
the seventies or eighties or whatever.

00:13:32.740 --> 00:13:34.200
So, but then I had various limitations.

00:13:34.460 --> 00:13:36.300
It didn't support 24 bit color.

00:13:37.040 --> 00:13:41.080
It's, you know, the pictures were fuzzy and the library that,

00:13:41.080 --> 00:13:44.780
that, that existed for working with sixel was not in good shape.

00:13:45.260 --> 00:13:48.380
So I said, okay, let me, you know, let me come up with my own

00:13:48.380 --> 00:13:51.320
protocol that works a lot, that gets past these limitations.

00:13:51.880 --> 00:13:54.400
And that's how the Kitty graphics protocol was born.

00:13:54.580 --> 00:13:56.860
And, you know, I, and then in designing that, I got a lot of feedback

00:13:56.860 --> 00:13:58.800
from people and we had a lot of discussions and stuff.

00:14:00.580 --> 00:14:04.080
And, you know, so some, some certain goals came out of that.

00:14:04.080 --> 00:14:07.420
So one of the, one of them was that in the local case, when we

00:14:07.420 --> 00:14:10.260
were not accessing to a different computer and viewing an image,

00:14:10.800 --> 00:14:12.880
you don't want to send it over the terminal because you have to

00:14:12.880 --> 00:14:14.980
import it as text, base 64 encoded or whatever.

00:14:15.220 --> 00:14:16.520
And that's, that kills performance.

00:14:16.760 --> 00:14:20.600
So I added the ability to, you know, view local files and in shared memory.

00:14:22.080 --> 00:14:25.700
So, you know, and then later on people asked for the ability to

00:14:25.700 --> 00:14:26.720
have animated images.

00:14:27.000 --> 00:14:27.520
It's like fine.

00:14:27.520 --> 00:14:30.280
I've done all this, like an animation, animated images.

00:14:30.820 --> 00:14:33.620
And then people were like, well, this doesn't work in tmux and

00:14:33.620 --> 00:14:36.240
it doesn't work in WeChat and it doesn't work in Vim.

00:14:36.340 --> 00:14:37.440
And I'm like, what the hell?

00:14:37.660 --> 00:14:42.220
So then somebody, somebody came up with the idea of using a so-called,

00:14:42.220 --> 00:14:43.400
you know, Unicode placeholder.

00:14:44.300 --> 00:14:48.700
So, which is basically you, you know, when you want, when you

00:14:48.700 --> 00:14:52.240
want to display an image in the terminal, you send a special Unicode character.

00:14:52.640 --> 00:14:58.600
So it's like hex code zero, but it isn't this one special Unicode

00:14:58.600 --> 00:15:01.640
character, private use area, which is not assigned for any other purpose.

00:15:02.780 --> 00:15:05.000
And so that acts as a placeholder.

00:15:05.400 --> 00:15:09.220
So an application that's not aware of the graphics protocol, just

00:15:09.220 --> 00:15:10.880
treats that placeholder as normal text.

00:15:11.140 --> 00:15:15.000
And then you use combining marks, a lot of diacritics and so on

00:15:15.000 --> 00:15:19.760
to add things like the image ID and, you know, the size and the

00:15:19.760 --> 00:15:20.520
placement and so on.

00:15:20.520 --> 00:15:22.420
That kind of information is encoded into the text.

00:15:22.900 --> 00:15:25.960
But because it looks at just plain normal text to the application,

00:15:26.420 --> 00:15:29.460
like Vim or tmux or whatever, the application just, you know,

00:15:29.480 --> 00:15:31.200
keeps it together and moves it around itself.

00:15:31.580 --> 00:15:33.560
And even though it doesn't know that it's actually working with an image.

00:15:34.240 --> 00:15:36.740
So with this kind of hack, you know, you could get the graphics

00:15:36.740 --> 00:15:42.040
protocol to work with things like tmux or Vim or whatever that

00:15:42.040 --> 00:15:44.440
didn't support the actual protocol.

00:15:45.100 --> 00:15:49.220
So that was the next big thing I did in kitty.

00:15:50.060 --> 00:15:55.600
And then after that, I used to get a lot of bug reports about,

00:15:55.880 --> 00:15:59.080
you know, this key combination is not working and that key combination

00:15:59.080 --> 00:15:59.740
is not working.

00:16:00.100 --> 00:16:05.400
And why can't I use control-shift-d in my application to, you know, whatever.

00:16:06.140 --> 00:16:10.540
So then I started looking into the state of keyboard handling

00:16:10.540 --> 00:16:12.300
in terminal and it was an absolute disaster.

00:16:14.180 --> 00:16:18.120
So, you know, I mean, words fail me.

00:16:19.040 --> 00:16:24.240
You know, like pressing alphabetic keys would just send the keys

00:16:24.240 --> 00:16:27.640
as those characters, you press A, it transmits the character A.

00:16:28.120 --> 00:16:31.280
So there's no way to tell, for example, if, you know, it's a key

00:16:31.280 --> 00:16:33.840
down event or a key up event or the A stands for a paste.

00:16:34.520 --> 00:16:36.760
So there's something called bracketed paste in, you know, terminal

00:16:36.760 --> 00:16:40.320
land, which was invented to solve this problem.

00:16:40.320 --> 00:16:42.740
There's a whole bunch of problems with this.

00:16:43.340 --> 00:16:46.660
The encoding for modifiers was so primitive that you could only

00:16:46.660 --> 00:16:49.600
really support control and alt that were not even together.

00:16:50.320 --> 00:16:54.440
And a lot of keys encoded to the same bytes.

00:16:55.000 --> 00:16:57.280
So like, for example, the classic example is a tab key and the

00:16:57.280 --> 00:16:59.100
control I key import to the same bytes.

00:16:59.360 --> 00:17:01.900
So you can't distinguish them in terminal programs, but they should

00:17:01.900 --> 00:17:04.140
put them before the kitty keyboard protocol.

00:17:04.140 --> 00:17:06.740
So I ended up making the kitty keyboard protocol.

00:17:07.080 --> 00:17:10.620
And I remember having long discussions with Bram, this was before

00:17:10.620 --> 00:17:13.480
he passed away, about getting it into Vim.

00:17:14.520 --> 00:17:18.020
And he ha d a lot of solid opinions about it.

00:17:18.520 --> 00:17:22.200
But finally, eventually, he agreed and made it into Vim and made

00:17:22.200 --> 00:17:23.620
it into neovim and various other terminals.

00:17:24.160 --> 00:17:26.820
And today it's fairly widely used, there are several terminals

00:17:26.820 --> 00:17:28.380
that use it and so on.

00:17:28.380 --> 00:17:35.080
So that was the next big thing I did in kitty.

00:17:35.180 --> 00:17:40.900
And then after that, my next windmill that I'm looking at is variable

00:17:40.900 --> 00:17:42.080
size text in the terminal.

00:17:43.000 --> 00:17:47.120
So when I'm catting a markdown file, I want to see the headings big and...

00:17:47.140 --> 00:17:50.780
Like in Emacs, right? Yes, yes.

00:17:50.940 --> 00:17:53.260
So why should only Emacs user benefit.

00:17:54.300 --> 00:17:56.200
I want all terminal users to be able to...

00:17:56.200 --> 00:17:58.580
Hear bigger headings, yeah. Yeah, yeah.

00:17:59.180 --> 00:18:06.340
So there's actually a program called PresentTerm, which can make

00:18:06.340 --> 00:18:07.220
presentations in the terminal.

00:18:07.720 --> 00:18:12.960
So that actually uses the kitty facility for showing multiple size

00:18:12.960 --> 00:18:16.240
text for headings and for superscripts and subscripts and so on.

00:18:16.480 --> 00:18:18.660
But anyway, that's getting ahead of the story.

00:18:18.960 --> 00:18:21.420
So I decided to look into that.

00:18:21.480 --> 00:18:23.620
So there's an existing standard, as always.

00:18:23.620 --> 00:18:27.900
I don't remember the name anymore.

00:18:28.100 --> 00:18:33.160
But basically what it would do is you can designate a line in

00:18:33.160 --> 00:18:38.400
the terminal buffer as twice, as two times the height, two times

00:18:38.400 --> 00:18:38.940
the font size.

00:18:39.380 --> 00:18:42.280
But the problem with this is that it does it for the whole line.

00:18:42.420 --> 00:18:44.940
It doesn't do it for just one character or two characters.

00:18:45.820 --> 00:18:47.880
So the problem with that is it doesn't work, for example, with

00:18:47.880 --> 00:18:49.140
a multiplexer like tmux.

00:18:49.140 --> 00:18:54.340
Because the whole line becomes double-sized when Tmux is splitting

00:18:54.340 --> 00:18:56.580
the screen into different screens.

00:18:57.280 --> 00:19:02.000
So we want to stop that double-sized thing at this point where

00:19:02.000 --> 00:19:03.380
multiplex is splitting the screen.

00:19:03.860 --> 00:19:05.040
So this was a non-starter.

00:19:05.400 --> 00:19:08.820
I mean, a lot of people use multiplexes, so it's not going to

00:19:08.820 --> 00:19:10.200
be suitable for this use case.

00:19:10.300 --> 00:19:12.360
And plus, then I also wanted superscripts and subscripts.

00:19:12.580 --> 00:19:14.440
Being an ambitious guy, I said, why stop at headings?

00:19:14.940 --> 00:19:16.740
Let's do superscripts and subscripts as well.

00:19:17.580 --> 00:19:22.500
So I said, okay, I've already made all these protocols, and people

00:19:22.500 --> 00:19:23.560
keep yelling at me for it.

00:19:23.560 --> 00:19:25.880
So let me add one more into it.

00:19:27.160 --> 00:19:30.100
So I made what's called the text-sizing protocol.

00:19:32.260 --> 00:19:36.660
So that protocol has the ability to make individual characters

00:19:36.660 --> 00:19:37.800
either bigger or smaller.

00:19:38.480 --> 00:19:42.700
So because of the nature of the terminal, it's a character, but

00:19:42.700 --> 00:19:44.480
it's made of equal-sized cells.

00:19:44.480 --> 00:19:46.960
So it's not completely free font size.

00:19:47.120 --> 00:19:50.560
It has to be either double or triple or quadruple or some fraction

00:19:50.560 --> 00:19:51.060
of a cell.

00:19:52.480 --> 00:19:55.980
It's not fully free size, but it's a lot better than what we had before.

00:19:58.080 --> 00:20:02.020
And then in the course of doing this work, because no good deed

00:20:02.020 --> 00:20:07.420
goes unpunished, I also decided to look into the...

00:20:08.420 --> 00:20:11.220
So a terminal UI is basically text.

00:20:11.220 --> 00:20:15.640
A program like Wave Modeling Editor draws its UI using text.

00:20:16.060 --> 00:20:19.880
There are some really cool symbols, some normal text, and so on.

00:20:20.300 --> 00:20:24.680
So now the problem is that the program running in the terminal

00:20:24.680 --> 00:20:28.020
and the terminal itself have to agree on the width of that text.

00:20:28.180 --> 00:20:31.260
By that, I mean how many cells a particular piece of text takes.

00:20:32.080 --> 00:20:36.140
So it's obvious for, let's say, ASCII text, English text, an A

00:20:36.140 --> 00:20:36.980
takes one cell.

00:20:38.380 --> 00:20:39.580
Emoji takes two cells.

00:20:39.580 --> 00:20:40.860
These things are well-established.

00:20:41.440 --> 00:20:43.080
Everybody agrees on them. So on.

00:20:43.120 --> 00:20:47.540
But the problem is that there's a lot more to text than just ASCII and emojis.

00:20:48.960 --> 00:20:52.260
There's thousands of languages, scripts, and there's all of Unicode.

00:20:53.800 --> 00:20:57.460
And so when you get into that, there are all sorts of complications.

00:20:58.880 --> 00:21:04.440
So for example, there's a pair of special characters called the

00:21:04.440 --> 00:21:05.720
variation selectors in the Unicode standard.

00:21:06.680 --> 00:21:12.580
So if you follow certain characters with a VS-16 variation selector,

00:21:12.740 --> 00:21:13.420
they become wide.

00:21:14.600 --> 00:21:17.600
If you follow a wide character with a VS-15 variation selector,

00:21:17.740 --> 00:21:18.240
they become narrow.

00:21:19.100 --> 00:21:24.880
Now if you think about it, if you think of the case of a wide

00:21:24.880 --> 00:21:27.480
character becoming narrow, now a terminal is a serial device,

00:21:27.960 --> 00:21:29.660
it gets bytes at a time, a character at a time.

00:21:30.060 --> 00:21:36.000
So imagine the terminal emulator gets a wide character, and the

00:21:36.000 --> 00:21:40.960
cursor has only one cell left at the current position.

00:21:41.020 --> 00:21:43.200
So it will go to the next line and put the wide character there.

00:21:43.660 --> 00:21:46.220
But then sometime later, you don't know how long, it could be

00:21:46.220 --> 00:21:49.580
any amount of time, because of network delays or whatever, you get

00:21:49.580 --> 00:21:51.780
the variation selector, which makes the wide character narrow.

00:21:52.220 --> 00:21:53.380
But now it's on the next line.

00:21:53.380 --> 00:21:56.420
You can't move it back up because the whole scroll back would

00:21:56.420 --> 00:21:58.480
have scrolled, you don't know what's happened and it's not possible

00:21:58.480 --> 00:21:59.340
to move it back up.

00:21:59.760 --> 00:22:03.340
So now what that means is that it's impossible to measure the

00:22:03.340 --> 00:22:09.500
width of a string of text in the presence of these variation selectors

00:22:09.500 --> 00:22:11.380
because you need to know the screen width.

00:22:12.600 --> 00:22:18.240
So if your wide character and the variation selector make it narrow

00:22:18.240 --> 00:22:20.440
right at the end of the screen, then they fall off the screen

00:22:20.440 --> 00:22:21.640
with the next line.

00:22:21.640 --> 00:22:24.340
So you can't calculate the width anymore without knowing the width

00:22:24.340 --> 00:22:25.520
of the string you're entering the text to.

00:22:26.040 --> 00:22:27.640
And this is a big problem for...

00:22:30.180 --> 00:22:33.020
If you're writing a terminal program, it becomes really difficult

00:22:33.020 --> 00:22:35.600
to work around this and deal with other issues.

00:22:35.800 --> 00:22:39.940
I mean, there is a whole small dashboard of issues.

00:22:40.080 --> 00:22:40.780
I'm not going to go into them.

00:22:40.820 --> 00:22:42.780
This was just an easy-to-illustrate one.

00:22:43.060 --> 00:22:46.400
So anyway, to fix this, I have made yet another standard.

00:22:46.760 --> 00:22:50.160
I've codified all the rules by which the width should be calculated.

00:22:50.160 --> 00:22:51.420
I've specified the algorithm.

00:22:53.200 --> 00:22:54.040
I've done all that.

00:22:54.700 --> 00:22:57.200
And as part of the text sizing protocol, there's a subsection

00:22:57.200 --> 00:22:57.980
of it called the width.

00:22:58.860 --> 00:23:01.900
So now terminal programs can send pieces of text to a terminal

00:23:01.900 --> 00:23:03.820
and specify what width they want to render in.

00:23:04.440 --> 00:23:08.680
So it doesn't matter now if the terminal and the program don't

00:23:08.680 --> 00:23:09.580
have to agree on the width.

00:23:10.000 --> 00:23:11.740
If one is different from the other, it doesn't matter.

00:23:12.340 --> 00:23:14.600
The program is in control and the terminal will just do what the

00:23:14.600 --> 00:23:15.340
program tells it to do.

00:23:15.780 --> 00:23:17.140
So this comprehensively solves this issue.

00:23:17.140 --> 00:23:18.080
But I mean, this is very new.

00:23:18.180 --> 00:23:19.360
I think this is just a few months old.

00:23:19.420 --> 00:23:21.340
So we'll see what sort of an option it gets in the future.

00:23:22.300 --> 00:23:28.540
But yeah, that's the latest thing I've been taking advantage of in kitty. Mm-hmm.

00:23:28.860 --> 00:23:32.700
Now, you talked about the kitty graphics protocol.

00:23:33.160 --> 00:23:34.980
Is that a standard now?

00:23:35.020 --> 00:23:37.980
Is that something that all of the terminals use?

00:23:38.280 --> 00:23:40.280
Not all by any chance, by any means.

00:23:41.220 --> 00:23:43.520
So the modern ones tend to support it.

00:23:44.220 --> 00:23:45.600
The older ones don't.

00:23:45.600 --> 00:23:49.900
So, for example, I think the first terminal other than kitty that

00:23:49.900 --> 00:23:50.960
supported it was wezterm.

00:23:52.500 --> 00:23:57.160
And now the new kid on the block, ghostty, also supports it.

00:23:58.120 --> 00:23:59.920
konsole supports it partly.

00:24:02.000 --> 00:24:03.720
But then there are big holdouts.

00:24:04.060 --> 00:24:08.180
For example, VTE library, which is used by the main terminal and

00:24:08.180 --> 00:24:09.100
all similar terminals.

00:24:09.720 --> 00:24:11.160
They don't support any image protocol.

00:24:11.300 --> 00:24:13.360
I think there's some discussion about them supporting sixel.

00:24:13.360 --> 00:24:15.440
But at the moment, they don't support anything.

00:24:15.640 --> 00:24:17.280
So those are just standard images.

00:24:18.360 --> 00:24:20.380
Then similarly, the multiplexers.

00:24:21.400 --> 00:24:23.540
I think tmux supports sixel

00:24:23.980 --> 00:24:26.860
There's a compile-time option, but not on by default.

00:24:28.060 --> 00:24:28.960
So it's a mess.

00:24:29.080 --> 00:24:31.460
I mean, if you're somebody whos writing terminal programming and

00:24:31.460 --> 00:24:36.660
wants to work in a lot of terminals, you really have to work hard

00:24:36.660 --> 00:24:39.160
and make some sort of abstraction layer over the latest protocols.

00:24:39.820 --> 00:24:42.160
I mean, the kitty graphics protocol is by far the best.

00:24:42.160 --> 00:24:43.920
I'm saying that, obviously, I'm biased.

00:24:44.520 --> 00:24:46.800
But it's clear to anyone who reads the protocols that it's by

00:24:46.800 --> 00:24:48.600
far the best design and most capable.

00:24:50.400 --> 00:24:54.620
So anyway, I'm hoping that it's an option we'll go over time.

00:24:55.480 --> 00:24:57.320
All I can do is wait it to go down.

00:24:57.720 --> 00:25:01.320
Yeah, I have played a little bit with images in terminals.

00:25:01.720 --> 00:25:06.120
And always the kitty graphics protocol seems the best option.

00:25:06.220 --> 00:25:09.900
And I use tmux and I view images inside NeoVim.

00:25:09.900 --> 00:25:14.140
So kitty graphics protocol is the only one that has allowed me to

00:25:14.140 --> 00:25:18.160
do that in wezterm, ghostty, kitty, of course, as well.

00:25:18.260 --> 00:25:21.760
So if other terminals want to adopt it, they can.

00:25:22.180 --> 00:25:25.260
Like Rio, for example, is a new terminal out there.

00:25:25.420 --> 00:25:30.700
So it can adopt the kitty graphics protocol and use it, right? Yes, absolutely.

00:25:30.820 --> 00:25:32.760
I encourage everyone to adopt it.

00:25:33.000 --> 00:25:34.020
There's an open spec.

00:25:34.780 --> 00:25:39.540
A lot of people have asked me questions about the protocol.

00:25:39.720 --> 00:25:41.460
And I try to answer them as quickly as possible.

00:25:42.220 --> 00:25:47.940
And I'm happy to consider amendments to the protocol to make it

00:25:47.940 --> 00:25:50.200
more functional or easier to implement.

00:25:50.500 --> 00:25:53.840
Or if you go to the graphics protocol page on the kitty website,

00:25:54.020 --> 00:25:57.480
you'll see a lot of version added things.

00:25:57.480 --> 00:26:01.280
All changes to the protocol I've made over time in response to

00:26:01.280 --> 00:26:05.960
requests from users and so on.

00:26:07.720 --> 00:26:11.100
In fact, now you can even watch videos in your terminals.

00:26:11.440 --> 00:26:12.920
MPV has a kitty backend.

00:26:14.120 --> 00:26:15.700
And it actually works quite well.

00:26:16.040 --> 00:26:22.760
I sometimes find myself watching videos in kitty. Interesting.

00:26:24.220 --> 00:26:28.020
So video was not a use case I envisioned when I made the protocol.

00:26:28.760 --> 00:26:32.940
But because of the shared memory method of transmitting images,

00:26:33.220 --> 00:26:36.060
the performance is actually acceptable for reasonably sized videos.

00:26:36.640 --> 00:26:41.120
And you're going to watch them inside your terminal. Okay, awesome.

00:26:41.640 --> 00:26:46.200
Talking about out-of-the-box use cases, there's actually a full

00:26:46.200 --> 00:26:48.420
Chromium instance that runs inside kitty using bus protocol.

00:26:48.420 --> 00:26:50.980
The project is called AWRIT.

00:26:52.500 --> 00:26:55.800
I guess it's a sort of play-on-all-right or something like that.

00:26:56.540 --> 00:27:00.040
But it runs a full Chromium instance and renders it inside kitty

00:27:00.040 --> 00:27:01.240
using the graphics protocol.

00:27:01.700 --> 00:27:05.300
And it uses the kitty keyboard protocol for commanding the keyboard

00:27:05.300 --> 00:27:06.140
and so on.

00:27:06.160 --> 00:27:07.900
So you can actually have a full browser in your terminal.

00:27:09.760 --> 00:27:11.740
Oh, I didn't know that. Interesting.

00:27:11.960 --> 00:27:14.460
So full browser in kitty, right?

00:27:14.740 --> 00:27:15.580
In kitty, yes.

00:27:15.580 --> 00:27:19.240
I think it also might work in ghostty.

00:27:19.720 --> 00:27:23.280
But ghostty's graphics protocol performance is not on par with kitty.

00:27:23.480 --> 00:27:25.680
So I think it would be a bit slow there.

00:27:26.440 --> 00:27:27.380
They're aware of it.

00:27:30.320 --> 00:27:32.720
But that's sort of the out-of-the-box uses.

00:27:32.920 --> 00:27:36.360
There's actually a page on the kitty website called integrations

00:27:36.360 --> 00:27:36.980
with other tools.

00:27:38.080 --> 00:27:41.000
Can I share your screen? Yeah, sure.

00:27:41.280 --> 00:27:42.800
I'll show you the page.

00:27:42.800 --> 00:27:44.620
I'll share it here.

00:27:45.460 --> 00:27:48.220
So you can see it starts out with image and document viewer.

00:27:48.320 --> 00:27:51.840
So there's a whole bunch of document viewers, PDFs.

00:27:51.920 --> 00:27:54.900
I told you about Markdown.

00:27:55.400 --> 00:27:57.040
And then there are these file managers.

00:27:57.420 --> 00:28:00.560
I think Ranger was the first terminal file manager we produced.

00:28:00.760 --> 00:28:02.580
Powered by kitty's graphics protocol.

00:28:03.040 --> 00:28:04.140
There's a whole bunch of others.

00:28:04.320 --> 00:28:07.140
But presentterm was the project I was telling you about.

00:28:07.200 --> 00:28:10.040
It shows Markdown-based slides with images.

00:28:10.040 --> 00:28:13.200
And actually now variable text size as well.

00:28:14.200 --> 00:28:15.020
So there's a whole bunch of these, awrit

00:28:15.660 --> 00:28:19.140
This is the full Chromium-based web browser running in the terminal.

00:28:20.920 --> 00:28:23.960
Even the old w3m, which is a venerable project.

00:28:24.260 --> 00:28:28.740
It's a text-mode browser, but it can show images using the kitty graphics protocol.

00:28:29.620 --> 00:28:31.820
MPV is the video player that can play videos in the terminal.

00:28:32.720 --> 00:28:36.920
Of course, there are all these various system data visualization tools.

00:28:40.300 --> 00:28:45.480
There are various editors that use kitty's remote control feature,

00:28:45.600 --> 00:28:51.740
which is the ability to control kitty over a socket using any program.

00:28:52.280 --> 00:28:54.460
There's a whole protocol for that.

00:28:54.920 --> 00:28:57.420
So many of these editors integrate with that remote control protocol.

00:28:57.700 --> 00:29:02.860
So we can navigate between terminal pins, and the pins in the windows

00:29:02.860 --> 00:29:05.240
and the editor itself seamlessly.

00:29:05.240 --> 00:29:10.060
For example, I think you mentioned using the images in nvim.

00:29:10.860 --> 00:29:14.520
So there are various image-filled plugins for nvim.

00:29:16.320 --> 00:29:19.760
So this is something that I'm working on currently, in the last

00:29:19.760 --> 00:29:20.880
month or so.

00:29:21.480 --> 00:29:25.100
A little while back, I released something called the Panel Kitten.

00:29:25.220 --> 00:29:25.940
Well, not a little while back.

00:29:26.020 --> 00:29:27.040
This was quite a while back.

00:29:27.500 --> 00:29:29.100
Initially, it used to work only on X11.

00:29:29.320 --> 00:29:32.100
What it does is it allows you to draw panels on your desktop.

00:29:32.100 --> 00:29:38.880
If you see on my screen, the top bar, this is actually a kitty instance

00:29:38.880 --> 00:29:43.440
running a terminal program that shows the system information.

00:29:45.480 --> 00:29:47.100
So the Panel Kitten...

00:29:48.240 --> 00:29:50.500
So kitty is like your Emacs.

00:29:50.820 --> 00:29:53.680
You run everything inside kitty? Yes.

00:29:54.480 --> 00:30:00.160
I like to live in the terminal as much as possible. Yeah.

00:30:01.300 --> 00:30:02.700
So let's see.

00:30:02.940 --> 00:30:06.780
So this is something I just released called the Quick Access Kitten.

00:30:07.320 --> 00:30:10.520
So this uses the Panel Kitten, and it gives you a terminal you

00:30:10.520 --> 00:30:12.900
can access at a single press, and it works in macOS, in

00:30:12.900 --> 00:30:13.620
Wayland, and in X11

00:30:14.440 --> 00:30:17.200
It was a huge headache getting it working in all three, but eventually it managed.

00:30:18.020 --> 00:30:22.000
So you can see here in the screenshot, the desktop background

00:30:22.000 --> 00:30:25.340
is a program called btop, and that's running inside kitty.

00:30:25.540 --> 00:30:28.020
And then on top of that, there is a Quick Access Kitty, which

00:30:28.020 --> 00:30:33.060
is this normal terminal, but it's overlayed on top of the desktop.

00:30:33.160 --> 00:30:35.180
If there were any windows open, then it would have been overlayed

00:30:35.180 --> 00:30:35.840
on top of the windows.

00:30:37.820 --> 00:30:43.620
So this works in MacOS, and here's a screenshot of it in hyprland and Linux.

00:30:46.660 --> 00:30:51.240
So this is something that I've been using, working on currently,

00:30:51.540 --> 00:30:56.700
and the part of it that I'm working on currently is using Kitty

00:30:56.700 --> 00:31:00.620
to replace the File Open Dialogs in Linux.

00:31:01.300 --> 00:31:09.980
So when you use a GUI program like, say, Firefox, and you say

00:31:09.980 --> 00:31:14.780
File, Save Page As, you get a File Open Dialog, usually.

00:31:15.260 --> 00:31:19.420
Here you see there's actually a Kitty instance that's running

00:31:19.420 --> 00:31:21.140
a file choosing kitten.

00:31:21.140 --> 00:31:26.980
So you can use a fuzzy finder like Selector, so you can just type a file.

00:31:27.000 --> 00:31:29.580
You can just type a few letters and it matches files accordingly,

00:31:29.920 --> 00:31:32.700
and you can use that to actually select files.

00:31:33.520 --> 00:31:40.180
So because I use Calibre a fair bit, I find myself using the File

00:31:40.180 --> 00:31:43.100
Open Dialog a fair bit, and that annoys me.

00:31:45.000 --> 00:31:45.500
Yeah, me too.

00:31:45.600 --> 00:31:50.760
It puts you in a completely different directory and I have to

00:31:50.760 --> 00:31:53.180
see, okay, where am I at and go and search?

00:31:53.320 --> 00:31:55.040
I don't like it. Yeah, exactly.

00:31:55.040 --> 00:32:00.280
So I decided to do something about that and make one that works

00:32:00.280 --> 00:32:03.440
the way I want it to work and uses, you know, let's keyboard-centric

00:32:03.440 --> 00:32:07.140
and fast and developer-friendly, blah, blah, So that's what I'm

00:32:07.140 --> 00:32:09.380
currently working on in Kitty.

00:32:09.540 --> 00:32:12.660
So the preview I showed you just now, it's not very good

00:32:12.660 --> 00:32:14.520
and could be worked on.

00:32:15.120 --> 00:32:18.740
But yeah, that's what I'm working on these days. Okay.

00:32:19.700 --> 00:32:23.940
Now, for people that don't know about Calibre, would you mind

00:32:23.940 --> 00:32:27.400
sharing a little bit about Calibre with us?

00:32:27.700 --> 00:32:33.340
Just letting us know what Calibre is for people that just know Kitty, right?

00:32:33.480 --> 00:32:34.960
Just a quick overview.

00:32:35.320 --> 00:32:40.780
So Calibre is an e-book management program.

00:32:41.240 --> 00:32:42.900
So e-books are basically electronic books.

00:32:43.940 --> 00:32:47.360
So what Calibre does is it allows you to manage a collection of e-books.

00:32:47.360 --> 00:32:50.700
So Calibre is mainly meant for somebody who's really into books,

00:32:50.940 --> 00:32:52.220
who wants to manage their own collection.

00:32:52.560 --> 00:32:56.100
If all you do is read one book a year, there's no need for Calibre.

00:32:56.140 --> 00:32:58.440
But if you're a serious reader, you read a lot of books, you have

00:32:58.440 --> 00:33:04.480
a collection, you'd like to search it, etc., then Calibre is for you.

00:33:05.240 --> 00:33:09.480
So its main interface is just a collection of books.

00:33:09.960 --> 00:33:16.880
You can change it to show covers, if you prefer that, and so on.

00:33:17.560 --> 00:33:21.560
Like Kitty, it's very much a swiss army knife, that's my philosophy in software.

00:33:22.260 --> 00:33:23.320
So it has a ton of features.

00:33:23.580 --> 00:33:27.000
You can edit the metadata of books, you can change the title,

00:33:27.280 --> 00:33:29.940
you can change the author, series, rating, whatever.

00:33:30.240 --> 00:33:31.280
You can download metadata.

00:33:32.240 --> 00:33:36.440
So there's a plug-in system which allows you, Calibre, to go and

00:33:36.440 --> 00:33:41.720
download metadata from different websites, amazon and a whole bunch of other programs.

00:33:45.300 --> 00:33:46.880
So that's the edit metadata.

00:33:47.060 --> 00:33:49.780
You can convert the books to different formats.

00:33:50.260 --> 00:33:52.220
So sadly, there's no standardization in the ebook space.

00:33:53.440 --> 00:33:57.040
EPUB is supposedly the standard format, but Amazon has its own

00:33:57.040 --> 00:34:02.080
proprietary format, and then Kobo, which is another ebook-reading

00:34:02.080 --> 00:34:03.820
device, has its own format called KEPUB.

00:34:04.280 --> 00:34:07.800
So as you can see, Calibre allows you to convert to all these

00:34:07.800 --> 00:34:11.720
various formats, including a bunch of legacy formats, like LIT,

00:34:12.020 --> 00:34:15.000
which is an ancient ebook format that Microsoft introduced.

00:34:15.800 --> 00:34:20.080
LRF was the ebook format, Sony's proprietary ebook format, and so on.

00:34:20.500 --> 00:34:26.580
You can even convert to Word documents, if you like, to and from, actually.

00:34:28.060 --> 00:34:30.740
So there's that, there's Convert, and there's View, there's Calibre's

00:34:30.740 --> 00:34:33.220
built-in Viewer, so you can view books.

00:34:33.380 --> 00:34:38.280
This is in dark mode, so it's white on black, but normally it's

00:34:38.280 --> 00:34:39.000
black on white.

00:34:39.000 --> 00:34:43.520
So you can view books, and the Viewer is actually capable of text-to-speech,

00:34:44.120 --> 00:34:49.760
and it has a pretty sophisticated search function, so you can

00:34:49.760 --> 00:34:53.700
search by text, you can search for whole words, nearby words,

00:34:53.780 --> 00:34:54.780
content, blah, blah, blah.

00:34:54.840 --> 00:34:58.920
So it's a good, it supports highlighting, you can highlight things.

00:35:01.180 --> 00:35:03.140
Add notes, and all that stuff.

00:35:03.640 --> 00:35:06.400
Add notes, highlight stuff, all that stuff, it's got everything

00:35:06.400 --> 00:35:07.960
that you would possibly want to do.

00:35:07.960 --> 00:35:11.740
And as with all my software, it's extremely customizable, it's

00:35:11.740 --> 00:35:15.320
got a huge set of preferences

00:35:16.140 --> 00:35:21.980
So it even has like a built-in Kindle app, we could say, right?

00:35:21.980 --> 00:35:24.760
So you can read, annotate, do everything with your books there.

00:35:25.440 --> 00:35:30.920
Yes, and not only, so I've shown you this, I've shown you this

00:35:30.920 --> 00:35:35.780
running, you know, a software on your desktop, but Calibre also

00:35:35.780 --> 00:35:40.900
has something called a Content Server, so you can start the Content Server,

00:35:45.640 --> 00:35:51.560
so start Content Server, and then if you go to the, I actually

00:35:51.560 --> 00:35:59.440
don't know how this is currently set up, but you can access your

00:35:59.440 --> 00:36:02.920
libraries in a browser.

00:36:02.920 --> 00:36:06.040
So this is a browser, this is actually Vise, which is my own personal

00:36:06.040 --> 00:36:09.160
browser, but you can access it in any standard browser.

00:36:09.640 --> 00:36:11.660
So you can access a collection on a browser, you can read the

00:36:11.660 --> 00:36:14.040
books, the same book that I was reading in the Calibre viewer,

00:36:14.140 --> 00:36:16.940
you can read it in your browser.

00:36:19.000 --> 00:36:21.580
So you can change pages, blah, blah, blah, whatever.

00:36:21.760 --> 00:36:25.420
And this works on mobile phones devices as well.

00:36:25.420 --> 00:36:29.960
So if you expose it correctly, you could access it from any device

00:36:29.960 --> 00:36:31.140
in your local network?

00:36:31.140 --> 00:36:33.900
Any device in your local network, or even over the internet, if

00:36:33.900 --> 00:36:37.950
you want to, it supports authentication and so on.

00:36:38.760 --> 00:36:41.220
So you can expose it over the internet, and when you're traveling,

00:36:41.400 --> 00:36:42.340
you can read books.

00:36:42.960 --> 00:36:45.100
That's up to you what you want to do with it.

00:36:46.120 --> 00:36:48.680
Quick question, quick question before you move on.

00:36:49.080 --> 00:36:52.740
Is there a Docker container version of Calibre

00:36:52.740 --> 00:36:54.580
that I can host on a server?

00:36:54.900 --> 00:36:56.620
There probably is.

00:36:56.620 --> 00:37:02.060
There is actually, but I personally, so Calibre comes as its own

00:37:02.060 --> 00:37:07.060
self-contained binary, but not a single binary, but a tar file

00:37:07.060 --> 00:37:09.160
which you untar into one directory.

00:37:09.540 --> 00:37:13.280
All you need to do is untar that tar file, and then you can run

00:37:13.280 --> 00:37:14.260
the server without it.

00:37:14.480 --> 00:37:17.400
It's all its dependencies bundled, you don't actually need tar.

00:37:18.200 --> 00:37:22.440
So you can go to

00:37:23.240 --> 00:37:26.260
So I can run it in a headless server, no GUI?

00:37:26.260 --> 00:37:29.040
Yes, no GUI, just run the server.

00:37:29.780 --> 00:37:37.600
There's an executable called calibre-server, so you can run the

00:37:37.600 --> 00:37:42.220
server, and that same server is running now via command line program

00:37:42.520 --> 00:37:46.360
So you can install this on any Linux machine and run the server

00:37:46.360 --> 00:37:49.660
and access it from anywhere.

00:37:50.260 --> 00:37:54.440
In fact, there are other projects, third-party projects that make

00:37:54.440 --> 00:37:57.160
their own Calibre servers, the most popular is something called

00:37:57.160 --> 00:38:01.300
Calibreweb, so you can use that instead with your Calibre library

00:38:01.300 --> 00:38:04.860
if you don't like the look of the default.

00:38:12.180 --> 00:38:15.400
So one other feature I'd like to highlight in Calibre, which some

00:38:15.400 --> 00:38:17.920
people don't know about, is the Fetch News feature.

00:38:18.280 --> 00:38:22.920
So the Fetch News feature basically allows you to download news

00:38:22.920 --> 00:38:25.020
from news websites, publicly accessible websites.

00:38:25.960 --> 00:38:29.800
So you can see that there's a whole bunch of, there are thousands of these.

00:38:30.200 --> 00:38:33.440
These are based on scripts called recipes that are maintained

00:38:33.440 --> 00:38:34.980
by Calibre users and me.

00:38:35.820 --> 00:38:39.660
And so they go out and they scrape the website and they download

00:38:39.660 --> 00:38:45.780
the news, and you can read the news as an e-book.

00:38:45.900 --> 00:38:51.580
So this is nice because it gives you a distraction-free sort of

00:38:51.580 --> 00:38:53.220
environment in which to read the news.

00:38:54.020 --> 00:38:57.940
You can't comment and you can't get distracted by external links

00:38:57.940 --> 00:38:58.600
and so on.

00:38:59.100 --> 00:39:00.760
And you can just focus on the actual content.

00:39:01.200 --> 00:39:01.700
So I do that.

00:39:01.960 --> 00:39:03.820
I mean, I personally, like I said, I read a lot.

00:39:05.440 --> 00:39:09.460
So I download three or four of these publications every week and

00:39:09.460 --> 00:39:10.460
I read them.

00:39:10.500 --> 00:39:17.600
In fact, one of my happy side effects is my daughter also uses

00:39:17.600 --> 00:39:20.720
Calibre to download publications and she likes to read them and

00:39:20.720 --> 00:39:21.620
I read them.

00:39:21.620 --> 00:39:25.800
So that was something kind of cool to see for myself.

00:39:27.360 --> 00:39:33.100
So yeah, that's the main headline features of Calibre.

00:39:33.620 --> 00:39:38.040
But it's, of course, it's the tip of the iceberg and I think that's suitable for.

00:39:38.700 --> 00:39:43.840
Now, my wife has a Kindle and sending books to that thing is not

00:39:43.840 --> 00:39:48.080
something that I enjoy, you know, because I have to send it to

00:39:48.080 --> 00:39:50.980
an email or I have to download an app.

00:39:50.980 --> 00:39:54.060
And it's just, I keep forgetting how to send books to it.

00:39:54.120 --> 00:39:56.960
If I have to send a book right now, I don't know how to do it.

00:39:56.960 --> 00:39:57.580
I don't remember.

00:39:57.900 --> 00:39:58.520
I have no idea.

00:39:58.740 --> 00:40:00.060
So let me give you a demo.

00:40:00.200 --> 00:40:01.500
I have a Kindle somewhere here.

00:40:01.660 --> 00:40:03.540
Let me just pick it up.

00:40:03.660 --> 00:40:06.800
I think this is the Kindle paper.

00:40:06.800 --> 00:40:07.680
I can see it.

00:40:08.420 --> 00:40:09.700
Yeah, I see it.

00:40:10.280 --> 00:40:14.200
So all I need to do is good old USB cable.

00:40:14.780 --> 00:40:15.560
There's no network.

00:40:16.220 --> 00:40:17.780
Amazon is not snooping on me.

00:40:18.720 --> 00:40:22.960
My Kindle stays in airplane mode all the time.

00:40:23.620 --> 00:40:25.860
I plug it into the, I'm plugging it into my laptop.

00:40:26.640 --> 00:40:31.880
If you look at the screen, if you look at the screen, yeah, it'll

00:40:31.880 --> 00:40:32.880
show up in a minute.

00:40:33.180 --> 00:40:35.160
It takes just two seconds to connect.

00:40:35.320 --> 00:40:36.920
You see, it's connected.

00:40:38.080 --> 00:40:39.900
So you just, so you just click on the book.

00:40:40.020 --> 00:40:42.160
Say I want to read the importance of being honest.

00:40:42.320 --> 00:40:45.160
You just click on this book and then click send to device.

00:40:45.700 --> 00:40:49.440
And Calibre will ask you convert the book to the format for the device.

00:40:50.340 --> 00:40:51.340
Because it's not pre-converted.

00:40:52.300 --> 00:40:53.020
Click yes, and that's it.

00:40:53.800 --> 00:40:57.780
It will automatically convert it to whatever Amazon's format is.

00:40:58.400 --> 00:40:59.000
Mobi, I think.

00:40:59.060 --> 00:41:00.140
Yes, yes, yes, yes.

00:41:00.260 --> 00:41:01.280
Mobi is the old one.

00:41:01.300 --> 00:41:02.360
Amazon actually has three formats.

00:41:03.240 --> 00:41:04.280
Let's not get into that.

00:41:04.420 --> 00:41:06.660
But it will get the most appropriate format for your Kindle

00:41:06.840 --> 00:41:11.740
and put it on the Kindle automatically, you can see the list of

00:41:11.740 --> 00:41:12.960
books on the device.

00:41:13.840 --> 00:41:17.100
You can, you know, delete them, whatever.

00:41:17.740 --> 00:41:19.200
transfer into your library and so on.

00:41:21.420 --> 00:41:25.500
So it's very simple, as you saw, you know, just plug it in, click

00:41:25.500 --> 00:41:26.840
the book and you click a button.

00:41:27.240 --> 00:41:31.760
And in fact, one of my happy, happy things I'm happy about with

00:41:31.760 --> 00:41:35.940
Calibre is I get a lot of positive feedback from elderly people.

00:41:37.780 --> 00:41:41.260
And because ebook readers are a big boom for elderly people, you

00:41:41.260 --> 00:41:42.720
can make the font size bigger.

00:41:43.400 --> 00:41:45.080
In fact, I do that myself.

00:41:45.660 --> 00:41:47.040
I don't know if you can see it.

00:41:48.100 --> 00:41:52.000
But yeah, as I age, my eyes have gotten weaker.

00:41:52.200 --> 00:41:55.100
And so I don't like to wear specs while reading on my Kindle.

00:41:55.200 --> 00:41:55.980
So I make the font size bigger.

00:41:56.000 --> 00:41:59.620
So, uh, you know, when I started, I didn't need that.

00:41:59.820 --> 00:42:00.360
Now I do.

00:42:00.580 --> 00:42:03.120
So, so, so I, but the point is, I get feedback from

00:42:03.120 --> 00:42:06.520
a lot of non-technical people, people who are, uh, you know, not

00:42:06.520 --> 00:42:08.900
so comfortable with computers saying that they really find Calibre

00:42:08.900 --> 00:42:09.560
easy to use.

00:42:09.920 --> 00:42:11.480
And now they're, they're able to use it.

00:42:11.480 --> 00:42:13.420
And a lot of people, you know, introduce their parents to it.

00:42:16.420 --> 00:42:20.820
And they're self-sufficient and they can figure it out on their own. Yeah.

00:42:20.880 --> 00:42:22.300
So that's really a good feeling.

00:42:22.480 --> 00:42:23.440
If you can figure it out. Yeah.

00:42:24.180 --> 00:42:25.780
It has happened to me as well.

00:42:25.780 --> 00:42:27.620
My font size used to be smaller.

00:42:28.080 --> 00:42:29.580
It increased this last year.

00:42:29.820 --> 00:42:31.360
My resolution also increased.

00:42:31.460 --> 00:42:34.140
So it's just going to get bigger and bigger from now on.

00:42:34.180 --> 00:42:35.720
I have a question for you.

00:42:36.180 --> 00:42:41.080
Have you gotten in trouble with Sony or with Amazon or any of

00:42:41.080 --> 00:42:42.820
these companies due to this tool?

00:42:43.500 --> 00:42:44.000
No, not at all.

00:42:44.140 --> 00:42:48.520
I don't, uh, so Calibre itself doesn't have any, uh, say DRM breaking facilities.

00:42:48.760 --> 00:42:51.520
Although there are third-party plugins that do this, Calibre itself

00:42:51.520 --> 00:42:52.400
doesn't do anything.

00:42:52.440 --> 00:42:53.100
So I've never gotten in trouble.

00:42:53.100 --> 00:42:56.660
In fact, in fact, in the early days, Sony wanted to buy Calibre.

00:42:57.280 --> 00:43:02.600
I remember going to their San Diego offices and talking to them about it.

00:43:03.020 --> 00:43:03.520
I don't know.

00:43:03.680 --> 00:43:07.440
One thing that didn't end up happening, but yeah, no, I've never

00:43:07.440 --> 00:43:07.940
gotten in trouble.

00:43:09.280 --> 00:43:12.900
Did they, didn't they get upset when you reverse engineered their

00:43:12.900 --> 00:43:15.240
protocol and all that stuff, Sony?

00:43:15.460 --> 00:43:16.340
They were really happy.

00:43:16.680 --> 00:43:20.700
So, you know, Calibre ended up being a better program than their

00:43:20.700 --> 00:43:22.680
proprietary reading program.

00:43:22.680 --> 00:43:24.380
Which often happens, you know, when the hardware companies are

00:43:24.380 --> 00:43:25.500
not good enough to make software or whatever.

00:43:26.520 --> 00:43:29.260
So, uh, and so they were happy because, uh, you know, Calibre

00:43:29.260 --> 00:43:33.220
was making their device more useful using their sales.

00:43:34.080 --> 00:43:35.180
They had no problem with it.

00:43:36.060 --> 00:43:40.500
Um, and in fact, so the PRS-500, the first one that at least had

00:43:40.500 --> 00:43:43.120
their own proprietary protocol, but later on they changed and

00:43:43.120 --> 00:43:46.320
the later models use the standard USB mass storage protocol.

00:43:46.840 --> 00:43:51.240
And so, uh, you know, there was no need for reverse engineering,

00:43:51.240 --> 00:43:52.740
uh, their protocol.

00:43:52.760 --> 00:43:55.200
And they started supporting the pod format over the next years

00:43:55.200 --> 00:43:56.280
that the PRS has gone through.

00:43:56.660 --> 00:43:59.840
So, so that was, uh, you know, good thing.

00:44:00.180 --> 00:44:03.920
And yes, they never had any, any, any issues with Calibre.

00:44:04.700 --> 00:44:05.200
Same with Amazon.

00:44:05.500 --> 00:44:09.100
I've had only, I think one interaction

00:44:09.100 --> 00:44:11.760
with somebody at Amazon, which was about some technical issue,

00:44:12.260 --> 00:44:18.460
but no, no, no, no problems. Okay.

00:44:18.460 --> 00:44:23.240
Now, um, well, Rumen in the comments says that, genius, that is

00:44:23.240 --> 00:44:27.120
what happens when a software developer solves problems for something

00:44:27.120 --> 00:44:28.200
that they're using.

00:44:28.200 --> 00:44:29.920
You use your tools, right?

00:44:29.920 --> 00:44:33.080
That's like one of the, yeah.

00:44:33.400 --> 00:44:36.700
So I mean, I make them because I use them myself. Yeah.

00:44:36.700 --> 00:44:40.140
That's the reason I mean, that's the reason they're, they're good actually.

00:44:40.500 --> 00:44:44.980
Now, do you ever get in trouble with Kitty because of the language

00:44:44.980 --> 00:44:46.640
that you decided to use Python?

00:44:46.640 --> 00:44:52.220
Since we hear every, you know, nowadays everyone is like Rust, Rust, Rust.

00:44:52.260 --> 00:44:54.740
You just hear that everywhere. Right?

00:44:55.240 --> 00:45:00.580
Uh, so on the contrary, I think Python using Python is one of Kitty's strengths.

00:45:01.180 --> 00:45:04.880
Um, so Kitty has a system called Kittens, which are like small

00:45:04.880 --> 00:45:10.220
programs that you can use to, uh, you know, to customize it behavior

00:45:10.220 --> 00:45:12.600
and modify its UI and so on.

00:45:13.060 --> 00:45:16.140
And so these are in Python and, and this feature was easy for

00:45:16.140 --> 00:45:18.140
me to add because Kitty was already in Python.

00:45:18.880 --> 00:45:21.420
Uh, so, you know, the problem that most people have with Python

00:45:21.420 --> 00:45:25.560
is that it's slow, but that's irrelevant because you will drop

00:45:25.560 --> 00:45:28.280
down to C or some other compiled language, whatever you like,

00:45:28.900 --> 00:45:31.540
um, for the performance sensitive parts.

00:45:31.800 --> 00:45:36.780
So like, for example, uh, in, in Kitty, um, the parsing of the

00:45:36.780 --> 00:45:42.600
text stream from the terminal program actually, uh, uses, uh, SIMD instruction.

00:45:42.840 --> 00:45:49.280
So that's, that's the one, um, in multi, uh, processing, uh, multiple

00:45:49.280 --> 00:45:52.320
amounts of data with a single CPU instruction, uh, so-called vector programming.

00:45:53.940 --> 00:45:58.320
Um, so I had to, so I wrote that by hand, uh, using a library

00:45:58.320 --> 00:46:00.240
called SIMD in C.

00:46:00.620 --> 00:46:03.780
And so, so, you know, when Kitty's parsing data, which is the

00:46:03.780 --> 00:46:07.020
performance sensitive part, it does this using, not even using,

00:46:07.040 --> 00:46:09.920
you know, regular C, but using something called SIMD, which is,

00:46:09.940 --> 00:46:13.020
which leverages your processor to the maximum for maximum performance

00:46:13.020 --> 00:46:14.040
and power efficiency.

00:46:14.820 --> 00:46:16.820
So, you know, the Python is not involved at all.

00:46:17.320 --> 00:46:20.220
Like once all the parsing is done and most of the, you know, things

00:46:20.220 --> 00:46:23.820
be converted to characters and styles and whatever else, then

00:46:23.820 --> 00:46:27.340
at some point Python gets involved and, you know, tells, tells

00:46:27.340 --> 00:46:30.500
the rest of the system where I'm a window to draw the, you know,

00:46:30.500 --> 00:46:33.480
to draw that buffer of characters, but that whole buffer of characters

00:46:33.480 --> 00:46:35.580
and its management is all happens in C.

00:46:36.740 --> 00:46:41.240
Um, so, you know, the performance aspect is completely irrelevant.

00:46:42.080 --> 00:46:45.460
And, uh, and, uh, python gives you a lot of flexibility.

00:46:45.920 --> 00:46:47.060
It's a great scripting language.

00:46:47.120 --> 00:46:48.900
I know most of the scripting languages in the world.

00:46:49.660 --> 00:46:52.160
And, uh, you know, so you can, you can stream Kitty in Python,

00:46:52.380 --> 00:46:52.940
which is great.

00:46:52.940 --> 00:46:55.820
And that came for free because the UI is in Python.

00:46:58.260 --> 00:47:01.640
Um, uh, so, so like, like, like, like, for example, other, uh,

00:47:01.640 --> 00:47:05.280
terminal terminators, mainly a compiled language, but be it Rust

00:47:05.280 --> 00:47:09.220
or C++ or whatever, they have to bolt on scripting.

00:47:09.320 --> 00:47:12.100
You know, you have to, you have to add a scripting engine and

00:47:12.100 --> 00:47:14.220
then expose your native APIs to it.

00:47:14.620 --> 00:47:17.620
Whereas in Kitty it's naturally there because everything's implemented.

00:47:18.740 --> 00:47:20.660
The higher level APIs are all in Python already.

00:47:21.440 --> 00:47:23.960
So yeah, you have, you have kittens written in Python, have access

00:47:23.960 --> 00:47:27.160
to everything, out of the box, I don't have to keep like, you know,

00:47:27.180 --> 00:47:28.540
bridging things and exposing things.

00:47:28.780 --> 00:47:31.680
I mean, it's, it's very efficient.

00:47:32.140 --> 00:47:33.140
Create a kitten.

00:47:33.280 --> 00:47:38.540
If I want to extend Kitty some way, just Python, not, no, no gimmicks, just Python.

00:47:39.160 --> 00:47:40.440
And, and it would work.

00:47:42.020 --> 00:47:44.820
So you, you can't, you can't do things like, uh, you know, change

00:47:44.820 --> 00:47:49.940
how Kitty parses input from the program because that happens in, in C code.

00:47:50.480 --> 00:47:53.480
But, but the whole UI, is in Python.

00:47:53.660 --> 00:47:55.900
So you can, you know, that's the part that users mostly care about, right?

00:47:55.900 --> 00:47:59.460
You don't care about how to deep down the guts of the thing work. Yeah.

00:47:59.460 --> 00:48:00.400
You care about the UI.

00:48:00.400 --> 00:48:03.540
You care about the experience of using it and customizing it.

00:48:03.540 --> 00:48:06.420
So that part is in Python and that, that's why it's customizable.

00:48:06.840 --> 00:48:08.420
So I think that that worked very well.

00:48:08.500 --> 00:48:12.980
And, uh, uh, and so, and so, so, you know, the thing that people

00:48:12.980 --> 00:48:17.360
have against C, uh, is that it's not memory safe, but, and that's

00:48:17.360 --> 00:48:18.340
true, it's not memory safe.

00:48:19.120 --> 00:48:23.600
But, uh, if you're a little bit careful and disciplined, um, that,

00:48:23.660 --> 00:48:25.400
that, that issue can be managed quite well.

00:48:25.420 --> 00:48:27.660
So like, if you look at Kitty's security history, there have been,

00:48:29.440 --> 00:48:33.860
1 or 2 unrelated, uh, bugs in almost a decade of history.

00:48:35.120 --> 00:48:39.780
So

00:48:39.780 --> 00:48:43.260
the main place that memory issues tend to bite people is in the

00:48:43.260 --> 00:48:45.600
lifetimes of objects or pieces of data.

00:48:45.700 --> 00:48:50.120
you forget to free something or use

00:48:50.120 --> 00:48:51.020
something afterwards freed.

00:48:51.260 --> 00:48:55.840
So I avoid that in the design of Kitty by mostly tying that into

00:48:56.300 --> 00:48:57.620
Python's memory management.

00:48:57.620 --> 00:49:02.840
So all the data structures also have a second, uh, identity as Python objects.

00:49:03.340 --> 00:49:06.620
So the Python runtime manages their lifetimes for me.

00:49:06.900 --> 00:49:09.120
So I can rely on it to clean it up with the garbage collection

00:49:09.120 --> 00:49:13.340
or whatever, but all the actual hot processing happens in C.

00:49:14.300 --> 00:49:17.260
Um, so, you know, using that, that combination, you get most of

00:49:17.260 --> 00:49:20.100
the memory safety just by piggybacking on Python's runtime.

00:49:21.020 --> 00:49:24.680
Um, but you can drop down to, you know, absolute, uh, speed to

00:49:24.680 --> 00:49:28.380
the extent of send instructions on, uh, whatever.

00:49:28.500 --> 00:49:29.620
I mean, you can see, you can do anything.

00:49:30.820 --> 00:49:34.440
I mean, you can even write, you know, pure assembly to an embedded

00:49:34.440 --> 00:49:34.980
thing, you see.

00:49:35.660 --> 00:49:37.640
So it doesn't get faster than that.

00:49:37.760 --> 00:49:41.340
So I think it's a, it's a, it's an underappreciated, but a good

00:49:41.580 --> 00:49:43.020
combination, at least it works for me.

00:49:43.900 --> 00:49:45.980
I always wondered, yeah.

00:49:45.980 --> 00:49:49.900
I always wondered why I didn't feel Kitty slow since it's written

00:49:49.900 --> 00:49:52.900
in Python, but I didn't understand like the heavy lifting and

00:49:52.900 --> 00:49:57.420
all the power processing is done in C because I compared it with,

00:49:57.420 --> 00:50:00.420
um, wezterm, which is written in Rust.

00:50:00.620 --> 00:50:04.220
I think Ghosty without Tmux, the three of them, right.

00:50:04.220 --> 00:50:07.660
Just scrolling up and down, you know, JK, just scrolling up and down.

00:50:07.980 --> 00:50:11.800
And I was like, but Kitty is Python and I don't see it slow.

00:50:11.940 --> 00:50:16.300
I don't feel a difference between the three, to be honest, Kitty, um, wezterm and ghostty.

00:50:16.760 --> 00:50:19.480
There is, there is no user perceptible difference.

00:50:19.960 --> 00:50:23.820
On all modern terminals, uh, you know, are designed with performance in mind.

00:50:23.820 --> 00:50:25.780
So like I said, you know, 10 years back when I started Kitty,

00:50:25.940 --> 00:50:28.520
this was not the case, a lot of core terminals left a lot of performance

00:50:28.520 --> 00:50:29.020
on the run.

00:50:30.600 --> 00:50:33.700
So, but the new generation of terminals all start out with performance in mind.

00:50:33.740 --> 00:50:35.120
So they're all pretty performant.

00:50:35.960 --> 00:50:38.600
I mean, there's not much user perceptible difference.

00:50:38.680 --> 00:50:40.640
I mean, if you run, if you run benchmarks, you can see the difference.

00:50:41.320 --> 00:50:44.060
But, uh, just from regular usage, you don't see any significant. Yeah.

00:50:44.080 --> 00:50:47.420
That's what matters, what you see and what you feel. Yeah.

00:50:47.840 --> 00:50:51.660
Now, how involved are you with, uh, both of the projects with

00:50:52.060 --> 00:50:57.180
and, um, and Kitty, are they mainly community driven or you take

00:50:57.180 --> 00:50:58.140
all the calls?

00:50:58.420 --> 00:50:59.200
How does that work?

00:50:59.840 --> 00:51:02.020
Um, so I work full time on, on open source.

00:51:02.400 --> 00:51:04.180
So, uh, like I said, that is my day jobs.

00:51:04.280 --> 00:51:05.260
Caliber is a huge community.

00:51:05.880 --> 00:51:07.900
Uh, it's fun to contribute.

00:51:08.360 --> 00:51:14.040
Engage with users. I deal with roughly about a hundred pieces of user

00:51:14.040 --> 00:51:18.060
communication every day, day in and day out for years on end.

00:51:18.060 --> 00:51:21.940
So, uh, and I merge PRs.

00:51:22.040 --> 00:51:22.540
I write code.

00:51:22.680 --> 00:51:26.340
I mean, so, so the reason I do this, like I said, I, I mean, I

00:51:26.340 --> 00:51:29.200
started out doing this for my own use, but obviously, I mean,

00:51:29.240 --> 00:51:33.100
they're grown far beyond that, I don't need, you know, 80% of

00:51:33.100 --> 00:51:36.180
the features that Caliber and Kitty have for my own personal use.

00:51:36.840 --> 00:51:41.040
Um, but you know, so those are common response to user requests

00:51:41.040 --> 00:51:42.600
and organic growth.

00:51:43.540 --> 00:51:46.800
Um, so, but the reason I do it is because I actually love coding.

00:51:47.100 --> 00:51:47.600
I love programming.

00:51:48.060 --> 00:51:48.740
I always have.

00:51:48.760 --> 00:51:52.120
I started programming at the age of seven and I've been programming

00:51:52.120 --> 00:51:52.740
all my life.

00:51:52.920 --> 00:51:54.560
So it's just something I love to do.

00:51:54.860 --> 00:51:57.500
So I make sure that I'm, you know, mostly programming.

00:51:57.760 --> 00:52:01.040
And then I, of course, do the user emails and support and stuff.

00:52:01.980 --> 00:52:02.920
And I merge PRs.

00:52:03.100 --> 00:52:09.360
And yes, I am the so-called benevolent dictator for life on both those projects.

00:52:09.380 --> 00:52:13.080
So I made the final calls and everything, but, uh, well, I'm very

00:52:13.080 --> 00:52:16.520
open to, uh, you know, people's ideas and PRs.

00:52:16.520 --> 00:52:20.220
You can see, if you go to the contributors page of both these

00:52:20.220 --> 00:52:22.600
projects, there are between 100 people that have contributed code

00:52:22.600 --> 00:52:23.360
to each project.

00:52:24.020 --> 00:52:31.060
So, uh, you know, um, yeah, that's, that's all it works for me. Hmm. Okay. Okay.

00:52:31.280 --> 00:52:33.980
Both of these projects have a bus factor of one.

00:52:35.060 --> 00:52:41.580
So that's why I do so much excercise, trying to keep myself healthy. Oh, okay.

00:52:43.400 --> 00:52:46.400
Now, um, I have a tough one for you.

00:52:46.420 --> 00:52:47.500
I have a good question.

00:52:47.920 --> 00:52:48.540
You want to see?

00:52:48.760 --> 00:52:53.040
Let me, uh, let me get some water first, yep yep, grab your water first

00:52:53.760 --> 00:52:54.760
You mentioned it.

00:52:55.000 --> 00:52:56.100
We briefly talked about it.

00:52:56.220 --> 00:52:58.880
I think you know what I'm going to ask probably, right?

00:53:00.080 --> 00:53:03.440
So lemme just say it, what are your thoughts on tmux?

00:53:04.840 --> 00:53:08.340
Oh, I, I don't have anything against tmux in particular, but terminal

00:53:08.340 --> 00:53:12.700
multiplexers as a whole, I, I think are a bad idea.

00:53:13.160 --> 00:53:15.220
Um, it's, the reason is quite simple.

00:53:15.640 --> 00:53:17.940
There are two, there are two reasons.

00:53:17.940 --> 00:53:23.600
One is, um, so a terminal multiplexer works, I mean, it is a traditional

00:53:23.600 --> 00:53:29.560
type of terminal multiplexer like tmux, um, works by, um, essentially

00:53:29.560 --> 00:53:31.580
implementing a terminal inside a terminal.

00:53:32.100 --> 00:53:36.280
So every byte of data that comes from the actual terminal application

00:53:36.280 --> 00:53:38.440
has to be interpreted by two terminals.

00:53:39.480 --> 00:53:45.360
Obviously this is a doubling of, you know, the cost, the halving

00:53:45.360 --> 00:53:48.440
of performance, doubling of CPU cost, whatever.

00:53:48.880 --> 00:53:49.660
But this cant be avoided

00:53:49.800 --> 00:53:53.540
No matter how well tmux designed it, you know, it is two terminals

00:53:53.540 --> 00:53:54.240
in the end.

00:53:54.740 --> 00:53:58.700
Um, so that is one, one obvious problem with terminal multiplexers.

00:53:58.800 --> 00:54:03.160
The other more insidious problem that most users may not realize

00:54:03.160 --> 00:54:08.860
or care about even is that, um, it makes it much harder to, uh,

00:54:08.860 --> 00:54:14.960
design new features into the terminal ecosystem because, uh, the

00:54:14.960 --> 00:54:17.300
terminal multiplexers, like I said, they're a second terminal, right?

00:54:17.300 --> 00:54:21.120
So if somebody is using say kitty and tmux, for a feature to work

00:54:21.120 --> 00:54:26.920
well, it has to be supported by both tmux and kitty, uh, and only,

00:54:27.000 --> 00:54:29.500
only both of them cooperate and both of them implement that feature.

00:54:29.680 --> 00:54:32.640
Does that feature actually end up in the hands of the end user

00:54:33.740 --> 00:54:36.000
Um, and, and, and it's worse than that.

00:54:36.000 --> 00:54:41.180
And that's because, uh, a terminal multiplexer, uh, works by essentially,

00:54:41.440 --> 00:54:46.800
uh, rewriting the escape codes that, uh, move between the terminal

00:54:46.800 --> 00:54:47.680
and the terminal program.

00:54:48.120 --> 00:54:50.620
So it has to do that because, you know, it splits up the screen,

00:54:51.080 --> 00:54:53.220
but the terminal doesn't know the screen has been split.

00:54:53.400 --> 00:54:55.120
The terminal program doesn't know the screen has been split.

00:54:55.760 --> 00:54:57.980
So, you know, they are both working on the assumption there's

00:54:57.980 --> 00:55:01.860
a single screen, but to somehow make that into two screens or,

00:55:01.960 --> 00:55:04.780
you know, movement, things like, say like a command to move the

00:55:04.780 --> 00:55:08.380
cursor to the end of the line, a simple command, or say the beginning

00:55:08.380 --> 00:55:10.520
of the line, even simple, that's the carriage return.

00:55:10.760 --> 00:55:12.500
That's just a simple character, right?

00:55:12.800 --> 00:55:16.280
Supposing you're in the right-hand side pane of a tmux split.

00:55:17.280 --> 00:55:21.800
Now, if, if, if tmux passed that carriage return character unmodified

00:55:21.800 --> 00:55:24.420
to the terminal below it, the cursor would actually move to the

00:55:24.420 --> 00:55:28.000
beginning of the left pane, but the program that's running in

00:55:28.000 --> 00:55:30.080
the right pane would have expected it to move to the beginning

00:55:30.080 --> 00:55:32.020
of the right pane, like that's its window.

00:55:32.540 --> 00:55:37.000
So tmux has to actually intercept that escape code and, you know,

00:55:37.000 --> 00:55:39.960
change it to something else, changes it to a cursor movement code

00:55:39.960 --> 00:55:43.740
that actually moves the cursor to the beginning of the right pane,

00:55:43.800 --> 00:55:45.740
which is actually the middle of the screen as far as the terminal,

00:55:45.840 --> 00:55:46.840
the actual terminal is concerned.

00:55:47.600 --> 00:55:49.700
And this is the simplest possible thing.

00:55:49.880 --> 00:55:52.040
It's the carriage return, you know, it's a really simple escape code.

00:55:52.160 --> 00:55:54.140
There are far more complicated escape codes.

00:55:54.240 --> 00:55:56.960
Like I told you a little bit about the kitty graphics protocol and

00:55:56.960 --> 00:55:59.780
Unicode placeholders and kind of hacks that we had to do to get

00:55:59.780 --> 00:56:00.580
it to work with tmux.

00:56:00.580 --> 00:56:05.240
So, you know, it imposes that kind of cost on the entire ecosystem.

00:56:06.920 --> 00:56:11.340
It becomes much harder, for new features to be developed and to propagate.

00:56:12.700 --> 00:56:15.720
You know, it ends up being like, there is, there is just a couple

00:56:15.720 --> 00:56:16.980
of gatekeepers for these features.

00:56:17.080 --> 00:56:19.740
So like, if I want to implement some feature on my terminal and

00:56:19.740 --> 00:56:22.800
make it available to my users, if my users are using tmux, I can't

00:56:22.800 --> 00:56:26.340
do it because, until, unless I can convince the tmux developers

00:56:26.340 --> 00:56:28.140
to agree with me and implement that feature too.

00:56:28.140 --> 00:56:30.520
I mean, I can try to do some hacks like I did with the graphics

00:56:30.520 --> 00:56:33.800
protocol, but, you know, that's suboptimal for obvious reasons.

00:56:35.260 --> 00:56:38.720
So that is, so, you know, I think that terminal multiplexers are

00:56:38.720 --> 00:56:42.640
a sort of drag on the ecosystem's evolution as a whole.

00:56:42.880 --> 00:56:49.160
So that is one of the other reasons that I think that terminal

00:56:49.160 --> 00:56:50.480
multiplexers are not a good idea.

00:56:50.660 --> 00:56:54.560
And finally, a terminal is really a giant state machine.

00:56:54.660 --> 00:56:56.060
There's like a huge amount of state.

00:56:56.060 --> 00:56:59.820
You know, the current text color, the, you know, the decorations,

00:57:00.300 --> 00:57:05.060
the underlines, the, you know, various little knobs that change

00:57:05.060 --> 00:57:06.940
what happens when you receive escape codes.

00:57:07.060 --> 00:57:09.700
I mean, I'm not going to go into details, but there's like a huge

00:57:09.700 --> 00:57:11.720
amount of state that every terminal maintains.

00:57:12.880 --> 00:57:15.920
And a terminal multiplexer not only maintains the state itself,

00:57:15.980 --> 00:57:19.680
it has to translate this state between its own state and what,

00:57:20.320 --> 00:57:24.940
and, you know, into some kind of state that works with its host terminal.

00:57:24.940 --> 00:57:26.540
And each host terminal is slightly different.

00:57:26.680 --> 00:57:29.360
You know, they have slightly different behaviors, quirks, features.

00:57:29.600 --> 00:57:32.120
And so the terminal multiplexer has to bridge between them.

00:57:32.340 --> 00:57:34.140
It's like an insanely complex problem.

00:57:34.800 --> 00:57:39.300
You're sort of bridging two, you know, slightly disparate states,

00:57:39.600 --> 00:57:41.100
very complex states, very large states.

00:57:41.220 --> 00:57:42.460
And you do it robustly.

00:57:42.680 --> 00:57:46.700
And so, you know, if you go to any terminal program or sophisticated

00:57:46.700 --> 00:57:49.740
terminal programs, bug tracker, and you search for, say, tmux,

00:57:49.800 --> 00:57:52.760
you find a whole bunch of bugs that occur only inside tmux.

00:57:53.720 --> 00:57:55.300
Not when they're running the host terminal.

00:57:55.720 --> 00:57:56.820
Yeah, I have experience.

00:57:57.000 --> 00:58:00.340
So, I mean, that's kind of the practical consequence of what I'm saying.

00:58:00.580 --> 00:58:03.560
I'm saying it abstractly like state machine and, you know, it

00:58:03.560 --> 00:58:04.220
has to bridge things.

00:58:04.300 --> 00:58:06.840
But the practical consequence is there are a lot of bugs that

00:58:06.840 --> 00:58:11.480
happen because, you know, the program has to run inside a terminal multiplexer.

00:58:12.120 --> 00:58:14.440
And that terminal multiplexer itself is running inside a terminal.

00:58:15.020 --> 00:58:19.200
And it's just an extra layer that, in my opinion, is not worth the cost.

00:58:19.200 --> 00:58:25.420
So, like, if I were to design a multiplexer myself, and this is

00:58:25.420 --> 00:58:29.480
on my to-do list at some point, I might end up doing it, is I

00:58:29.480 --> 00:58:34.740
would not try to split a single TTY into multiple windows.

00:58:35.420 --> 00:58:40.060
Instead, I would, you know, delegate the window management to

00:58:40.060 --> 00:58:45.100
the terminal and have a dedicated TTY per window.

00:58:45.700 --> 00:58:46.560
So, this is much more robust.

00:58:46.560 --> 00:58:48.580
It doesn't require all the, you know, like, for example, the carriage

00:58:48.580 --> 00:58:49.800
return thing that I said.

00:58:50.340 --> 00:58:51.880
It just works automatically.

00:58:52.420 --> 00:58:54.880
So, the downside of this is that my multiplexer will only work

00:58:54.880 --> 00:58:58.660
with, you know, one or two terminals because, you know, it requires

00:58:58.660 --> 00:59:00.760
features from the terminal which different terminals may not have.

00:59:01.020 --> 00:59:04.200
So, for example, kitty doesn't have this, but wezterm has its

00:59:04.200 --> 00:59:08.220
own multiplexer, which you can use as an alternative to tmux.

00:59:09.320 --> 00:59:12.320
So, you know, I don't know the details of how that works, but

00:59:12.320 --> 00:59:13.560
I'm guessing it's something similar.

00:59:14.380 --> 00:59:19.380
And so, if I were ever to make a multiplexer… So, the main use

00:59:19.380 --> 00:59:23.140
case of multiplexers generally is the remote persistence use case.

00:59:23.280 --> 00:59:27.560
So, you're going to SSH into a server and, you know, your network

00:59:27.560 --> 00:59:29.400
connection is flaky, so it could go off any time.

00:59:29.660 --> 00:59:32.100
If you lose it, if your network drops, you don't want to lose your session.

00:59:32.680 --> 00:59:34.700
You know, the running program shouldn't end and so on.

00:59:34.700 --> 00:59:39.060
So, that's the one thing that I would still say that tmux is somewhat useful for.

00:59:39.060 --> 00:59:46.180
For the local use case, I'm of the opinion that multiplexers are completely anti-pattern.

00:59:46.780 --> 00:59:49.620
You can do everything that you can do locally without the multiplexer,

00:59:49.860 --> 00:59:51.020
just as well, if not better.

00:59:52.580 --> 00:59:57.420
But for the remote use case, I can see the use case.

00:59:57.680 --> 00:59:59.020
I personally would not use it.

00:59:59.400 --> 01:00:02.740
I have other ways of dealing with this problem, but I can see

01:00:02.740 --> 01:00:03.700
that it can be useful.

01:00:04.000 --> 01:00:07.280
So, if I were to design a multiplexer, what I would do is I would

01:00:07.280 --> 01:00:10.560
make it, you know, cooperate with this host terminal so that the

01:00:10.560 --> 01:00:13.240
windowing and the splitting of this, you know, the screen, the

01:00:13.240 --> 01:00:18.100
multiplexing part is managed by the terminal and only the session

01:00:18.100 --> 01:00:21.920
persistence part is managed by the actual multiplexer program.

01:00:22.380 --> 01:00:23.380
So, yeah, separation of concerns.

01:00:23.560 --> 01:00:25.560
I mean, it is the terminal's job, after all, to, you know, put

01:00:25.560 --> 01:00:28.280
up windows and interact with them and whatever.

01:00:28.660 --> 01:00:31.140
So, let the terminal do that and let the multiplexer focus on

01:00:31.140 --> 01:00:34.420
the session persistence, which is what it needs to do. Yeah.

01:00:34.420 --> 01:00:37.340
So, you know, that would be my approach.

01:00:38.160 --> 01:00:40.840
I have a question for you there.

01:00:41.780 --> 01:00:45.260
The reason why I use tmux, I don't care about servers because

01:00:45.260 --> 01:00:47.920
I don't, you know, my servers are locally.

01:00:47.920 --> 01:00:49.200
I SSH into them.

01:00:49.280 --> 01:00:51.540
If I lose the connection, I don't care. Right. It's fine.

01:00:51.840 --> 01:00:55.040
That part about tmux is not important for me.

01:00:55.040 --> 01:00:57.000
If it's a remote server, I lose the connection.

01:00:57.100 --> 01:00:59.360
I just SSH into it again. Fine.

01:00:59.660 --> 01:01:01.460
I don't mind about that too much.

01:01:01.780 --> 01:01:05.100
But what I use tmux for is sessions, right?

01:01:05.100 --> 01:01:07.680
With the keyboard shortcut, right?

01:01:08.160 --> 01:01:10.920
Three keys that I press on my keyboard, I jump to my dotfiles.

01:01:11.120 --> 01:01:14.580
If I press another shortcut, I jump to my, what?

01:01:15.140 --> 01:01:16.380
Whatever, project A.

01:01:16.760 --> 01:01:19.680
Another key, I jump to GitHub repos.

01:01:19.800 --> 01:01:22.480
Each one of them is a GitHub repo, which is a tmux session.

01:01:22.700 --> 01:01:26.620
That is the only reason I use tmux. Sessions.

01:01:26.640 --> 01:01:32.360
So, you can completely replicate that using a scriptable Terminal.

01:01:32.360 --> 01:01:44.580
I would say kitty, but I suspect you can do the same with wezterm, Kitty has a remote control API.

01:01:45.200 --> 01:01:47.160
So, let me just show you that one.

01:01:48.140 --> 01:01:49.060
I'll switch to your screen.

01:01:50.720 --> 01:01:54.420
So, can you ask Kitty, okay, is this session running?

01:01:54.520 --> 01:01:56.280
If it is running, just switch to it.

01:01:56.420 --> 01:01:57.440
Do not create it.

01:01:58.480 --> 01:02:00.180
Because that's the main thing, you know?

01:02:00.980 --> 01:02:06.360
So, for example, Kitty has an ls command.

01:02:07.760 --> 01:02:10.700
So, let me show it to you in the actual terminal, and it falls

01:02:10.700 --> 01:02:11.400
in the documentation.

01:02:12.600 --> 01:02:14.560
So, I'm starting Kitty.

01:02:16.300 --> 01:02:19.540
I'm giving it that I want to allow remote control.

01:02:20.020 --> 01:02:22.560
So, here you see, I have started Kitty.

01:02:23.220 --> 01:02:25.400
Now, let me create a couple of windows.

01:02:26.240 --> 01:02:28.580
Supposing in one window, I run cat.

01:02:30.180 --> 01:02:33.960
And now, I want to check if Cat is running.

01:02:34.040 --> 01:02:38.380
So, you can run this command, kitten @ ls

01:02:38.700 --> 01:02:42.000
So, what this does is, it outputs a whole bunch of data in JSON

01:02:42.000 --> 01:02:43.640
format about what windows are running.

01:02:43.700 --> 01:02:50.520
So, you can see in here somewhere, there'll be a window one and window two.

01:02:50.880 --> 01:02:57.320
And somewhere in there, you can see here

01:02:57.320 --> 01:03:01.040
the title

01:03:01.500 --> 01:03:05.220
So, you can see here the foreground processes.

01:03:06.340 --> 01:03:09.560
So, you can see here, this window is running the kitten @ ls

01:03:09.560 --> 01:03:13.000
command, but the next window will be running cat.

01:03:13.460 --> 01:03:16.320
So, you can easily query this using any tool like jq or whatever.

01:03:17.080 --> 01:03:21.460
You have that information at your disposal.

01:03:22.160 --> 01:03:28.280
And then you can run a command like kitten @ focus-window

01:03:28.820 --> 01:03:30.880
and you switch to that window.

01:03:32.680 --> 01:03:34.800
So, I'm showing you the building blocks.

01:03:34.960 --> 01:03:36.000
I'm not showing you a ready-made solution.

01:03:36.120 --> 01:03:37.480
You have to write your own script and so on.

01:03:37.780 --> 01:03:38.760
But the building blocks are there.

01:03:38.840 --> 01:03:40.360
You can do all this kind of thing.

01:03:40.420 --> 01:03:42.700
I mean, I myself use these workflows sometimes.

01:03:43.380 --> 01:03:47.020
And like I showed you in the integrations page, there are...

01:03:50.560 --> 01:03:52.660
But this is panes, right?

01:03:52.660 --> 01:03:54.100
I don't use panes too much.

01:03:54.360 --> 01:03:54.860
I use sessions.

01:03:54.920 --> 01:03:57.540
So, a session occupies the entire screen for me.

01:03:57.780 --> 01:03:59.120
I switch to the other session.

01:03:59.660 --> 01:04:03.220
So, these are called OS windows in kitty.

01:04:03.540 --> 01:04:05.460
It can focus tabs.

01:04:06.080 --> 01:04:07.520
That's the whole screen.

01:04:07.520 --> 01:04:08.900
It can also...

01:04:08.900 --> 01:04:13.040
It's not showing it here, but you can also use it to focus OS windows.

01:04:13.500 --> 01:04:17.920
So, like if you're using a hyprland or some kind of tiling window manager,

01:04:20.760 --> 01:04:26.120
you can get from the ls command, you can get the ID of the window,

01:04:26.760 --> 01:04:28.980
the OS window, and then you can tell your tiling window manager

01:04:28.980 --> 01:04:30.020
to switch to that.

01:04:30.380 --> 01:04:31.380
So, you just write a script.

01:04:32.540 --> 01:04:36.520
Or if you don't want to use a tiling window manager, you can use tabs instead.

01:04:36.800 --> 01:04:39.240
So, tabs work the same as that.

01:04:39.800 --> 01:04:44.720
So, you have one session per tab, and you use a focus tab command

01:04:44.720 --> 01:04:47.520
right here, and then you can do whatever you like.

01:04:47.600 --> 01:04:48.460
I mean, you can build your own workflow.

01:04:48.640 --> 01:04:51.120
So, there are no ready-made workflows for this in kitty, at least

01:04:51.120 --> 01:04:51.760
at the moment.

01:04:52.100 --> 01:04:55.640
But the basic building blocks are there, and you can use them

01:04:55.680 --> 01:04:56.720
to compose your own workflow.

01:04:57.000 --> 01:05:01.280
So, I kind of like that because I have different workflows for different scenarios.

01:05:02.440 --> 01:05:05.300
One size doesn't fit all the scenarios.

01:05:05.860 --> 01:05:08.400
So, in kitty, my philosophy is to give you the building blocks,

01:05:08.660 --> 01:05:12.740
give you the remote control protocol, and a tool to control kitty,

01:05:12.840 --> 01:05:15.120
and then you build it, use it however you like.

01:05:15.460 --> 01:05:18.020
I mean, in fact, remote control doesn't just work within kitty.

01:05:18.120 --> 01:05:19.260
You can use it from outside kitty.

01:05:19.340 --> 01:05:21.400
You can even do it over a TCP port.

01:05:21.400 --> 01:05:23.700
So, you can do it from a different computer in your house.

01:05:23.860 --> 01:05:26.220
I mean, you can possibly design this.

01:05:27.340 --> 01:05:33.180
So, all that is built into kitty, and those building blocks are there.

01:05:33.360 --> 01:05:37.800
So, you can build your tools from that.

01:05:37.860 --> 01:05:39.600
So, I was showing you the editor integration.

01:05:40.700 --> 01:05:45.600
So, for example, vim-slime is a vim plugin that allows you to

01:05:45.600 --> 01:05:49.840
have a LISP REPL that you can control using kitty remote control.

01:05:50.080 --> 01:05:52.960
So, you can just send whatever you're working on to the repo in

01:05:52.960 --> 01:05:56.500
the neighboring pane, and have it execute that kind of thing.

01:05:57.180 --> 01:06:02.040
So, kakoune is an editor that doesn't have its own windowing, but

01:06:02.040 --> 01:06:06.000
it integrates with tmux or with kitty or other multiplexers.

01:06:06.360 --> 01:06:09.500
So, we use the native windows of that solution other than its own windows.

01:06:12.040 --> 01:06:15.660
So, the building blocks are there, and people have made things with them.

01:06:16.220 --> 01:06:21.800
So, if you wish to look into it, you can do so, and make your

01:06:21.800 --> 01:06:25.920
own solution that your particular personal workflow. Oh, okay.

01:06:26.120 --> 01:06:30.900
Do you talk to the tmux maintainer for compatibility when you

01:06:30.900 --> 01:06:32.540
try to deploy something new?

01:06:33.020 --> 01:06:33.940
Do you have communication?

01:06:34.240 --> 01:06:35.040
What's his name?

01:06:35.700 --> 01:06:36.740
I don't remember his name.

01:06:39.100 --> 01:06:41.680
I did try, but he wasn't interested.

01:06:42.260 --> 01:06:43.720
So, I don't anymore.

01:06:45.260 --> 01:06:51.060
Now, when I make something new, I try to keep in mind the needs of multiplexers.

01:06:52.440 --> 01:06:55.760
I have some facility in there, so I'll show you an example.

01:06:57.880 --> 01:07:01.220
So, this is a section in the kitty website called terminal protocol extensions.

01:07:02.320 --> 01:07:04.300
So, let's look at desktop notifications.

01:07:05.220 --> 01:07:11.260
So, this is an extension that kitty has that allows you to show

01:07:11.260 --> 01:07:13.980
desktop notifications on the user's desktop from the terminal

01:07:13.980 --> 01:07:16.880
program using the escape codes.

01:07:17.380 --> 01:07:20.240
So, there are already existing solutions, but kitty is one that

01:07:20.240 --> 01:07:24.140
adds various features that show a button when a notification wins.

01:07:25.940 --> 01:07:32.480
Anyway, the point is that, going all the way down, there is this

01:07:32.480 --> 01:07:34.300
little section, identifier.

01:07:35.560 --> 01:07:39.920
So, the thing with notifications here is that when the terminal

01:07:39.920 --> 01:07:41.680
program sends a notification, it has a button.

01:07:41.840 --> 01:07:45.000
The user can click that button, and then the terminal sends back

01:07:45.000 --> 01:07:49.980
an event to the terminal program saying that this button has been clicked.

01:07:51.120 --> 01:07:54.600
So, how is that working with the terminal multiplexer?

01:07:54.760 --> 01:07:57.580
Because the terminal doesn't know which program inside the terminal

01:07:57.580 --> 01:07:59.900
multiplexer has sent a thing.

01:08:00.100 --> 01:08:05.140
So, this identifier feature is there just for that, so that terminal

01:08:05.140 --> 01:08:08.080
multiplexers can add identifiers to these escape codes.

01:08:08.280 --> 01:08:09.840
Like I said, they have to rewrite escape codes.

01:08:10.140 --> 01:08:12.160
So, they rewrite the escape code adding an identifier.

01:08:12.720 --> 01:08:15.600
And so, when the terminal responds to that notification with an

01:08:15.800 --> 01:08:18.700
event, it sends back that identifier, and the terminal multiplexer

01:08:18.700 --> 01:08:21.300
can read that identifier and from its own internal list, send

01:08:21.300 --> 01:08:22.080
it to the correct window.

01:08:22.680 --> 01:08:27.240
So, these kind of things I try to keep in mind so that multiplexers

01:08:27.240 --> 01:08:28.860
can work with features like this.

01:08:29.860 --> 01:08:35.720
It's not always possible to do so without cooperation from multiplexer

01:08:35.720 --> 01:08:39.220
authors, but as much as possible, I do that.

01:08:42.160 --> 01:08:44.920
That is one of my problems with terminal multiplexers.

01:08:45.140 --> 01:08:46.180
It just makes everything harder.

01:08:47.360 --> 01:08:50.680
Here, there is a dedicated channel between the terminal and the program.

01:08:51.040 --> 01:08:52.420
So, you don't need to worry about identifiers.

01:08:52.560 --> 01:08:54.160
You don't need to care about who sent what.

01:08:54.240 --> 01:08:56.440
It just goes on the channel, and it's automatic.

01:08:56.920 --> 01:08:59.680
Once you put a multiplexer in the mix, you have, okay, which window

01:08:59.680 --> 01:09:00.500
did it come from?

01:09:02.400 --> 01:09:05.100
If two notifications come from two different windows at the same

01:09:05.100 --> 01:09:05.780
time, what happens?

01:09:06.140 --> 01:09:11.740
All these sort of things you have to think about and complicates life unnecessarily. Yeah.

01:09:12.240 --> 01:09:16.180
I think sessions is one of the main reasons why a lot of people

01:09:16.180 --> 01:09:17.480
use Tmux still.

01:09:17.540 --> 01:09:20.920
There's other people that do the remote server thing that you mentioned, right?

01:09:20.960 --> 01:09:25.780
So, imagine that having a protocol that not only works in Kitty,

01:09:25.840 --> 01:09:27.880
but works with Ghosty wezterm as well.

01:09:28.180 --> 01:09:31.980
Like, I don't know, a session protocol that works regardless of

01:09:31.980 --> 01:09:33.240
the terminal that you use (you see what I did there MF, planting a seed)

01:09:34.280 --> 01:09:40.600
So, the problem with that is that it becomes a sort of lowest common denominator issue.

01:09:40.600 --> 01:09:44.600
Then the protocol can expose only features that all the terminals

01:09:44.600 --> 01:09:45.440
that support it have.

01:09:45.940 --> 01:09:48.980
So, if you want a new feature, all the terminals have to agree.

01:09:49.180 --> 01:09:50.960
And so, that becomes a break on development again.

01:09:51.240 --> 01:09:52.580
That's a trade-off, right?

01:09:52.580 --> 01:09:55.860
But the advantage is that then the multiplexer using that protocol

01:09:55.860 --> 01:09:58.820
would work with all the terminals robustly.

01:09:59.280 --> 01:10:01.640
So, I mean, it's a trade-off, right?

01:10:02.460 --> 01:10:06.820
And different producers will be able to disagree on what end of

01:10:06.820 --> 01:10:08.840
the trade-off makes more sense.

01:10:09.540 --> 01:10:14.420
So, I'm very firmly of the camp that multiplexers, at least the

01:10:14.420 --> 01:10:17.660
traditional ones like Tmux, are a bit of an anti-pattern.

01:10:18.980 --> 01:10:22.800
I personally have been using terminals for a very long time.

01:10:23.620 --> 01:10:27.120
And like everybody else, I was excited by my multiplexer when

01:10:27.120 --> 01:10:28.900
I formed my workflow.

01:10:29.440 --> 01:10:33.820
But even back then, I came across issues that were caused just

01:10:33.820 --> 01:10:36.360
by using multiplexer that didn't happen if it were just in the terminal.

01:10:36.520 --> 01:10:37.760
At that time, I didn't know much about it.

01:10:37.880 --> 01:10:38.600
I didn't really understand.

01:10:39.060 --> 01:10:43.620
But that alone was enough for me to form the opinion that this

01:10:43.620 --> 01:10:44.660
is possibly not a good idea.

01:10:44.820 --> 01:10:47.000
So, I avoided them in my own personal workflows.

01:10:48.460 --> 01:10:53.140
And then when it came time for me to make my own terminal, I tried

01:10:53.140 --> 01:10:56.240
to replicate the good parts of the multiplexers, the sessions,

01:10:56.820 --> 01:11:02.060
the control, the flexibility, as much as possible within the terminal itself.

01:11:02.480 --> 01:11:06.940
Because in my opinion, the terminal is the right level of abstraction

01:11:06.940 --> 01:11:09.780
for this, the right place for window management and interacting

01:11:09.780 --> 01:11:13.760
with the user and keyboard shortcuts, mouse actions, and so on.

01:11:14.020 --> 01:11:15.040
It should be managed by the terminal.

01:11:15.180 --> 01:11:19.940
The terminal is better positioned to do that than a terminal multiplexer.

01:11:20.560 --> 01:11:21.820
So, it made sense to me.

01:11:21.820 --> 01:11:24.520
Yeah, makes sense. Yeah.

01:11:24.980 --> 01:11:28.220
Now, moving on to another topic that I have here, we've been here

01:11:28.220 --> 01:11:29.060
for a long time.

01:11:29.220 --> 01:11:30.780
How much time do you have left?

01:11:31.820 --> 01:11:35.920
I would say about 15-20 minutes. Okay. Okay. Okay. Awesome.

01:11:36.560 --> 01:11:41.440
I noticed the cursor animations in Kitty, they were released,

01:11:41.520 --> 01:11:42.720
I don't know, a few months ago.

01:11:42.720 --> 01:11:44.640
Were they inspired by Neovide?

01:11:44.920 --> 01:11:45.940
Have you heard about Neovide?

01:11:46.520 --> 01:11:47.000
Yeah, yeah, yeah.

01:11:47.000 --> 01:11:49.720
So, I didn't actually make those features.

01:11:49.720 --> 01:11:51.020
It was contributed by a user.

01:11:51.020 --> 01:11:54.140
Let me see if I can bring it up.

01:11:55.280 --> 01:11:56.180
Let me see.

01:11:57.200 --> 01:11:58.100
Yes, here we go.

01:11:58.100 --> 01:11:59.220
Here's the pull request.

01:12:00.320 --> 01:12:02.980
So, by a user called jinhwanlazy

01:12:03.360 --> 01:12:05.180
I don't know if I'm pronouncing that right.

01:12:05.540 --> 01:12:11.880
So, he's made this pull request, add cursor trail feature to enhance the serviceability.

01:12:11.960 --> 01:12:13.920
So, it was completely out of the blue for me.

01:12:14.360 --> 01:12:15.860
I mean, I was not thinking about it.

01:12:15.860 --> 01:12:16.640
It was not on my radar.

01:12:16.760 --> 01:12:19.380
Some user came and suggested this feature.

01:12:20.260 --> 01:12:23.500
And so, you know, it was quite a large feature.

01:12:24.120 --> 01:12:26.000
We worked together and we implemented it.

01:12:26.360 --> 01:12:27.100
Mostly, he did it.

01:12:27.140 --> 01:12:28.560
I just provided some feedback.

01:12:29.860 --> 01:12:31.760
And that's how it came out.

01:12:31.860 --> 01:12:33.440
And yes, he knew about Neovide.

01:12:33.680 --> 01:12:36.940
I think he was inspired by that.

01:12:36.980 --> 01:12:40.660
I think if you search this page, you'll find Neovide somewhere.

01:12:42.300 --> 01:12:43.180
There you go.

01:12:43.220 --> 01:12:47.900
You can see right in the pull request, the very first post that's mentioned.

01:12:48.840 --> 01:12:55.400
So, yeah, it was inspired by Neovide, but not by me. Okay, okay.

01:12:55.400 --> 01:12:59.140
Now, I just want to know about your setup a little bit more since

01:12:59.140 --> 01:13:00.300
we don't have a lot of time.

01:13:00.400 --> 01:13:03.000
And I just want to have a few minutes for questions as well.

01:13:03.680 --> 01:13:06.400
Your main IDE, which one is it?

01:13:07.480 --> 01:13:09.640
It used to be vim, now it's neovim.

01:13:10.540 --> 01:13:11.290
So, you can see this is a kitty file inside neovim

01:13:14.400 --> 01:13:17.280
I mean, it used to be vim for a very long time.

01:13:17.940 --> 01:13:22.660
But once Bram passed away, and there was some LSP.

01:13:23.000 --> 01:13:25.920
integration in Neovim and so on, I switched to Neovim.

01:13:26.320 --> 01:13:29.400
In fact, there's a very nice plugin for Neovim

01:13:29.660 --> 01:13:33.380
kitty-scrollback.nvim plugin, which I'm glad to be using.

01:13:33.920 --> 01:13:37.840
Which allows you to browse this scrollback in kitty inside Neovim

01:13:37.840 --> 01:13:41.520
very conveniently and copy it to the keyboard, edit it, whatever.

01:13:42.880 --> 01:13:51.960
So, when you're in a terminal, you get a lot of history, right?

01:13:52.520 --> 01:13:56.680
So, in kitty, if you press CTRL-SHIFT-H, this opens by default in less.

01:13:56.800 --> 01:13:58.680
So, you can search it and whatever.

01:14:00.760 --> 01:14:03.140
So, less is the default, but it's a solid UI.

01:14:03.180 --> 01:14:04.400
Also, you can use your own program.

01:14:05.160 --> 01:14:06.760
And so, this allows you to use Neovim.

01:14:07.060 --> 01:14:10.680
This plugin I'm talking about allows you to use Neovim as less

01:14:10.680 --> 01:14:12.000
to browse the scrollback.

01:14:12.440 --> 01:14:15.420
And so, kitty also has a feature that you can see the last command

01:14:15.420 --> 01:14:17.200
output, for example.

01:14:18.720 --> 01:14:22.160
If I press CTRL-SHIFT-G, the last command's output opens in less.

01:14:24.540 --> 01:14:27.840
So, again, you can use Neovim instead and do something with it.

01:14:31.700 --> 01:14:34.280
So, to answer your question, sorry, I got sidetracked

01:14:35.140 --> 01:14:37.020
I use Neovim as my IDE.

01:14:37.280 --> 01:14:43.720
So, I program primarily in Python, C, Go, my own language called

01:14:43.720 --> 01:14:48.820
rapydscript-ng, and a little bit of Cocoa

01:14:48.980 --> 01:14:51.760
I don't know how to pronounce that. Apple's Objective-C.

01:14:57.140 --> 01:14:59.840
Neovim is my common IDE for all those languages.

01:15:02.280 --> 01:15:03.440
I develop both Calibre and Kitty.

01:15:03.920 --> 01:15:10.420
In fact, I've always used vim until I switched to neovim

01:15:10.420 --> 01:15:16.960
So, it feels like you're trying to bring the Emacs experience

01:15:16.960 --> 01:15:18.380
into the terminal.

01:15:18.700 --> 01:15:23.160
Like, you're trying to make the terminal like your operating system.

01:15:23.520 --> 01:15:25.260
Notifications, browser, everything.

01:15:25.360 --> 01:15:27.980
What's your thoughts on Emacs?

01:15:30.380 --> 01:15:31.620
I'm fine with Emacs.

01:15:31.780 --> 01:15:34.200
I just prefer the modal editing experience, which is why I went

01:15:34.200 --> 01:15:35.400
with vim

01:15:36.820 --> 01:15:44.540
In fact, way back, the modal editing and the verbs, the motion

01:15:44.540 --> 01:15:46.340
verbs and so on, they just clicked with my brain, so I went to vim

01:15:47.940 --> 01:15:51.760
Once you learn something, then, you know, I've been happy with Neovim.

01:15:52.560 --> 01:15:58.220
And talking about making everything a terminal, I pressed the

01:15:58.220 --> 01:15:59.460
print screen key on my keyboard.

01:15:59.640 --> 01:16:02.720
I knew that a screenshot tool, which is actually a kitty window.

01:16:03.480 --> 01:16:08.980
And so, I'm just showing you how much I rely on Kitty in my own workflows.

01:16:09.960 --> 01:16:14.540
Why not just come up with the kitty operating system and we just

01:16:14.540 --> 01:16:17.320
avoid the operating system?

01:16:17.600 --> 01:16:18.620
Someday, someday, someday.

01:16:19.120 --> 01:16:23.540
After I write that long-promised multiplexer that includes remote persistence.

01:16:25.360 --> 01:16:29.120
And what's your operating system of choice, by the way?

01:16:29.200 --> 01:16:29.880
Is it Linux?

01:16:29.920 --> 01:16:31.660
I saw macOS somewhere in there.

01:16:32.220 --> 01:16:34.660
Yeah, no, my operating system choice is Linux.

01:16:34.680 --> 01:16:37.860
It has been since I was 13 or something.

01:16:38.600 --> 01:16:39.380
Ages and ages ago.

01:16:40.640 --> 01:16:43.840
So, I have macOS and Windows machines because I write software

01:16:43.840 --> 01:16:45.200
for both platforms as well.

01:16:46.440 --> 01:16:50.300
But my own OS of choice is Linux.

01:16:50.780 --> 01:16:55.100
So, like, Calibre, for example, is built for Linux, Windows and macOS.

01:16:55.820 --> 01:17:00.520
So, the macOS and Windows build has happened in QEMU with virtual machines.

01:17:01.420 --> 01:17:03.940
Which may not be strictly needed, I'm not sure.

01:17:06.500 --> 01:17:10.500
So, nowadays people do that, you know, using GitHub Actions or whatever.

01:17:10.500 --> 01:17:12.180
But I mean, Calibre is 20 plus years old.

01:17:12.320 --> 01:17:13.240
There was no GitHub back then.

01:17:14.480 --> 01:17:15.720
CI pipelines and stuff.

01:17:15.820 --> 01:17:16.460
So, I had to make my own.

01:17:16.940 --> 01:17:18.180
So, I used QEMU.

01:17:18.680 --> 01:17:21.080
Originally, I used VMware and then I switched to QEMU.

01:17:21.760 --> 01:17:24.380
So, now it's just, I just type in one command and it builds up

01:17:24.380 --> 01:17:27.700
in all three platforms. Automatically.

01:17:29.200 --> 01:17:30.620
Anyway, sorry, go on.

01:17:31.420 --> 01:17:35.400
I know, because I was going through the Calibre's usage statistics

01:17:35.400 --> 01:17:38.540
and I noticed that most of the users are Windows.

01:17:38.760 --> 01:17:39.900
And I was like, why?

01:17:40.160 --> 01:17:43.680
But you already explained that because most of the user base is

01:17:43.680 --> 01:17:46.060
old people (sorry old reading folks, no disprespect meant, at least you guys support the man) and they are definitely on Windows.

01:17:46.200 --> 01:17:49.740
I assume that's why, right? So, yeah.

01:17:49.740 --> 01:17:51.620
I mean, most of everybody is on Windows.

01:17:51.620 --> 01:17:57.720
Globally, Windows has an 80% market share of desktop and laptop computers.

01:17:59.820 --> 01:18:01.300
Yeah, most of the users.

01:18:01.420 --> 01:18:06.540
I mean, the Calibre usage reflects mostly that Calibres

01:18:06.540 --> 01:18:11.680
are not techie, not in the techies particularly.

01:18:12.500 --> 01:18:14.510
So, non-techie people use it.

01:18:14.510 --> 01:18:20.370
And those are, they probably follow the distribution of OSs that

01:18:20.370 --> 01:18:22.230
the general market does.

01:18:24.650 --> 01:18:31.010
So, people often ask me, how do you make a successful open source product?

01:18:31.610 --> 01:18:33.390
So, I often say you have to go where the users are.

01:18:33.510 --> 01:18:40.590
So, when I made the Windows and macOS ports of the orignal libprs500, because most people

01:18:40.590 --> 01:18:43.530
use those operating systems, so if I wanted to be successful,

01:18:43.790 --> 01:18:47.370
I had to go where the users are.

01:18:47.490 --> 01:18:51.130
So, kitty, for example, I don't care about it being that successful

01:18:51.130 --> 01:18:53.890
because it's really my workflow tool (linkarzu note: and even if it was, which it is, these open source MFs don't like donating)

01:18:54.230 --> 01:18:55.330
As you can see, I use it for everything.

01:18:55.650 --> 01:18:59.750
So, I only bother with macOS because macOS is close to Linux,

01:18:59.830 --> 01:19:00.930
so it's not that much effort.

01:19:01.670 --> 01:19:05.830
People keep requesting that I port kitty to Windows, but the amount

01:19:05.830 --> 01:19:06.530
of effort is much larger.

01:19:06.770 --> 01:19:08.290
So, I just don't bother.

01:19:09.510 --> 01:19:11.610
There's WSL on Windows anyway.

01:19:11.610 --> 01:19:16.810
So, they just let them run WSL and deal with it (sorry for the 3 windows users that use kitty LMAO). All right.

01:19:17.530 --> 01:19:21.770
So, due to time, I'm not going to continue with any other questions.

01:19:22.390 --> 01:19:25.190
Is there anything you want to share with the audience?

01:19:25.430 --> 01:19:27.470
Like, how can people support you?

01:19:27.870 --> 01:19:30.530
Is this through Calibre or how can they?

01:19:30.630 --> 01:19:32.770
Because you live off of open source, right?

01:19:32.870 --> 01:19:34.490
I live off of open source, yes.

01:19:34.490 --> 01:19:35.630
So, you can donate.

01:19:35.710 --> 01:19:38.430
I know I have a Calibre website or GitHub sponsors.

01:19:38.430 --> 01:19:39.670
Let me show you.

01:19:42.330 --> 01:19:48.850
So, if you go to either Kitty or Calibre's GitHub page, there's

01:19:48.850 --> 01:19:49.850
a Sponsors button.

01:19:52.450 --> 01:19:54.650
So, there's a Sponsors Project button.

01:19:54.690 --> 01:19:55.790
So, you can do it via GitHub.

01:19:55.890 --> 01:19:59.510
You can do it via Patreon, LibrePay, and so on.

01:19:59.610 --> 01:20:01.190
So, you know, whatever floats your boat.

01:20:01.490 --> 01:20:04.330
And that's how you can keep me financially going.

01:20:04.810 --> 01:20:10.870
And the other ways of supporting me is by contributing to the projects.

01:20:11.030 --> 01:20:12.290
Something that stretches your own reach.

01:20:12.810 --> 01:20:13.950
It could be a translation.

01:20:14.270 --> 01:20:15.050
It could be documentation.

01:20:15.330 --> 01:20:16.010
It could be code.

01:20:16.650 --> 01:20:18.150
It could be issue triage.

01:20:18.770 --> 01:20:22.510
So, for example, in Calibre, there's a huge community.

01:20:22.670 --> 01:20:23.330
I have millions of users.

01:20:23.510 --> 01:20:26.310
There's no way I can do that support myself.

01:20:26.530 --> 01:20:29.630
So, there's a Calibre forum on this website called mobileread.com,

01:20:29.690 --> 01:20:31.290
which I had mentioned in the introduction.

01:20:31.910 --> 01:20:35.470
So, there are a lot of veteran Calibre users who would like to

01:20:35.470 --> 01:20:39.390
answer user posts so that I don't have to answer everything myself.

01:20:39.870 --> 01:20:43.550
But if you look, for example, in all of the URLs here in this

01:20:43.550 --> 01:20:49.870
forum, you can see that I have one of the karma points for people's questions.

01:20:50.070 --> 01:20:53.370
So, you can see how many questions I've answered.

01:20:54.390 --> 01:20:58.430
So, you know, if you want to sort of help out with these projects,

01:20:58.570 --> 01:21:02.050
you can, if you're an experienced user, you can join one of these

01:21:02.050 --> 01:21:03.030
forums and answer questions.

01:21:03.130 --> 01:21:07.230
I mean, there are Reddit forums, sort of Calibre, and the GitHub issue triage.

01:21:08.050 --> 01:21:11.910
So, that's one way you can contribute if you're not technically

01:21:11.910 --> 01:21:14.060
inclined in an app for whatever reason.

01:21:15.430 --> 01:21:18.770
So, there are lots of ways of contributing.

01:21:18.890 --> 01:21:21.690
So, like Calibre, for example, I mentioned, it has a fetching feature.

01:21:21.870 --> 01:21:25.370
So, you can download things like, you know, New York Times or

01:21:25.370 --> 01:21:27.950
Google News or whatever.

01:21:28.690 --> 01:21:32.110
So, those are based on Python scripts to scrape those websites.

01:21:32.110 --> 01:21:34.050
And so, those are maintained by users.

01:21:35.290 --> 01:21:39.370
I tried to pitch in, but I mean, I obviously have other things to do.

01:21:40.170 --> 01:21:42.330
So, you know, those are mostly maintained by users.

01:21:42.510 --> 01:21:43.670
And so, you can contribute to that.

01:21:43.730 --> 01:21:46.190
I mean, that's a relatively contained simple problem.

01:21:50.450 --> 01:21:54.930
Yeah, the ways to contribute to open source are endless. Okay, yeah.

01:21:54.930 --> 01:21:56.510
A lot of work, man. I see.

01:21:56.990 --> 01:21:59.670
Those are huge projects, and you have plans.

01:21:59.670 --> 01:22:03.110
I don't know, how you have the time, you know, to work and all that stuff?

01:22:03.690 --> 01:22:05.070
Yeah, I have.
I work all the time.

01:22:05.670 --> 01:22:09.530
Like I said, I love to program. That's good.

01:22:10.270 --> 01:22:12.910
Now, one last question, just to wrap it up.

01:22:13.330 --> 01:22:15.770
And can you live off of open source?

01:22:15.950 --> 01:22:18.210
Then you're the living proof that you can, right?

01:22:18.210 --> 01:22:23.750
So, you mind just sharing a small, I don't know, whatever you

01:22:23.750 --> 01:22:24.590
want to share with people.

01:22:25.430 --> 01:22:31.130
So, I've been living off open source since I graduated from grad

01:22:31.130 --> 01:22:37.810
school, which was about 15 years, I'd say.

01:22:39.510 --> 01:22:41.310
And so, it's going strong.

01:22:42.330 --> 01:22:44.470
I'm quite confident that I'll be here for 15 years more.

01:22:46.110 --> 01:22:50.170
So, I just want to say that it's really possible to make a life

01:22:50.170 --> 01:22:51.370
writing open source software.

01:22:52.060 --> 01:22:54.730
Some key things that you should keep in mind is go where the users

01:22:54.730 --> 01:22:56.970
are, and solve real problems.

01:22:57.270 --> 01:22:59.730
Solve your own problems, especially, but your problems.

01:23:01.190 --> 01:23:04.370
Don't try to change the world or whatever, but just find some

01:23:04.370 --> 01:23:07.930
actual problem that you have, or that people have, and solve it.

01:23:08.510 --> 01:23:12.850
And be dedicated, be honest, work hard, and be lucky.

01:23:13.750 --> 01:23:14.370
That plays a part.

01:23:15.010 --> 01:23:17.370
Calibre was so successful because I happened to be in the right

01:23:17.370 --> 01:23:18.070
place at the right time.

01:23:18.170 --> 01:23:20.090
That was a big part of the success.

01:23:22.690 --> 01:23:23.950
So, you can try.

01:23:25.290 --> 01:23:27.510
It's a nice lifestyle if you can make it work.

01:23:28.210 --> 01:23:32.210
At the end of the day, when I look back at my life and I see how

01:23:32.210 --> 01:23:35.250
I've done these things, I feel proud that I've made the world

01:23:35.250 --> 01:23:36.150
a slightly better place.

01:23:36.570 --> 01:23:38.330
So, that's a good feeling.

01:23:39.370 --> 01:23:41.030
And it's a lifestyle where you're the own boss.

01:23:41.570 --> 01:23:46.290
I work very hard, I spend a large fraction of my day just working.

01:23:46.830 --> 01:23:50.030
But it's at my own convenience, at my own pace.

01:23:50.030 --> 01:23:51.970
I can take off for a holiday anytime I want.

01:23:52.000 --> 01:23:57.440
So that I get to spend time with my kids, with my wife, my family, friends.

01:23:57.900 --> 01:24:02.440
So you know, though I do work hard, I also have the flexibility

01:24:02.440 --> 01:24:03.820
to live a decent life.

01:24:05.120 --> 01:24:05.880
That's what's important.

01:24:05.880 --> 01:24:08.080
And you don't want to have another dictator.

01:24:08.360 --> 01:24:11.140
You want to be the only one, right? Yeah.

01:24:11.440 --> 01:24:17.820
You know, I'm the kind of person that likes to march to my own beat, so. Yeah, definitely.

01:24:18.540 --> 01:24:19.660
That's a huge benefit.

01:24:25.160 --> 01:24:25.840
Yeah source rules.

01:24:26.040 --> 01:24:27.660
I mean, go for it if you can.

01:24:28.640 --> 01:24:33.640
You leave a huge legacy, man, because it's huge tools, huge communities

01:24:33.640 --> 01:24:35.500
that you're leaving or that you're creating.

01:24:35.960 --> 01:24:37.540
So really appreciate it.

01:24:37.540 --> 01:24:40.280
You know, even more appreciate your time being here.

01:24:40.360 --> 01:24:41.760
I'm going to leave the links.

01:24:41.980 --> 01:24:45.200
Well, everyone knows your tools, so I don't need even to leave

01:24:45.200 --> 01:24:47.300
the links, but I'm going to leave them in the video description.

01:24:47.300 --> 01:24:50.680
So if you want to share some links with me, just share them, I'll put

01:24:50.680 --> 01:24:51.400
them in the video.

01:24:51.800 --> 01:24:54.160
Really appreciate your time, Covid.

01:24:54.480 --> 01:24:57.780
I hope to see you again whenever you want to share something about kitty.

01:24:57.960 --> 01:25:01.280
Hey, there's all these new features that I have about kitty and I

01:25:01.280 --> 01:25:02.960
want somewhere to share them.

01:25:03.120 --> 01:25:06.380
You can come to my channel and we can do this screen sharing thing,

01:25:06.380 --> 01:25:09.780
talking and all that stuff and you can share them with everyone.

01:25:10.120 --> 01:25:15.500
When sessions arrive, please let me know and, you know, share them here.

01:25:15.500 --> 01:25:18.860
Yeah, no, I don't have any links right now.

01:25:18.940 --> 01:25:23.400
I just say, you know, find a program, doesn't have to be Calibre or kitty.

01:25:23.460 --> 01:25:26.820
Find a program that, you know, you use and that you have good

01:25:26.820 --> 01:25:28.780
ideas to include and go into it.

01:25:31.080 --> 01:25:34.700
I don't want you to come and necessarily work in Calibre or kitty

01:25:34.700 --> 01:25:37.220
and go do some open source something.

01:25:37.900 --> 01:25:40.440
I'm not going to post any links to any of my projects, go out

01:25:40.440 --> 01:25:44.080
there, find your own, whatever makes you happy.

01:25:46.980 --> 01:25:48.660
All right, kovid, really appreciate it.

01:25:49.260 --> 01:25:52.140
We'll see you till next time then. All right. Yeah.