Changelog & Friends – Episode #53

There’s a TUI for that

with Nick Janetakis

All Episodes

Nick Janetakis is back and this time we’re talking about TUIs (text-based user interfaces) — some we’ve tried and some we plan to try. All are collected from Justin Garrison’s Awesome TUIs repo on GitHub. This episode is “AI free.”

Featuring

Sponsors

CronitorCronitor helps you understand your cron jobs. Capture the status, metrics, and output from every cron job and background process. Name and organize each job, and ensure the right people are alerted when something goes wrong.

SentryCode breaks, fix it faster. Don’t just observe. Take action. Sentry is the only app monitoring platform built for developers that gets to the root cause for every issue. 90,000+ growing teams use sentry to find problems fast. Use the code CHANGELOG when you sign up to get $100 OFF the team plan.

Paragon – Ship native integrations to production in days with more than 130 pre-built connectors, or configure your own custom integrations. Built for product and engineering. Learn more at useparagon.com/changelog

Fly.ioThe home of Changelog.com — Deploy your apps and databases close to your users. In minutes you can run your Ruby, Go, Node, Deno, Python, or Elixir app (and databases!) all over the world. No ops required. Learn more at fly.io/changelog and check out the speedrun in their docs.

Notes & Links

📝 Edit Notes

Chapters

1 00:00 Let's talk! 00:38
2 00:38 Sponsor: Sentry 03:17
3 03:55 Hanging with Nick 05:08
4 09:03 Reading blogs on YouTube 01:15
5 10:18 Missing plot hole? 06:29
6 16:47 One machine to rule them all 04:30
7 21:17 TUI talk 01:21
8 22:38 Ratatui 01:59
9 24:37 Terminal tools, tips & tricks 04:43
10 29:20 Sponsor: Cronitor 04:23
11 33:42 Still rockn' Atuin 11:44
12 45:27 Pitching Adam tmux 04:07
13 49:34 Diving deep into tmux 05:40
14 55:14 bashtop 05:16
15 1:00:30 One layer deeper (btop++) 03:28
16 1:03:58 What exactly is a TUI? 07:34
17 1:11:32 VisiData for tabular data 01:30
18 1:13:02 Sponsor: Paragon 03:39
19 1:16:41 Beyond DevTools 13:40
20 1:30:21 Docker stats 01:58
21 1:32:19 Moar TUIs! 01:31
22 1:33:50 LazyDocker 06:42
23 1:40:31 Should we TUI-it? 02:00
24 1:42:31 Adam enjoys a good TUI 00:59
25 1:43:30 Get the install right 05:19
26 1:48:50 This was fun. We're done. 00:48
27 1:49:37 Outro 01:31
28 1:51:08 BTW, Nick loves our T-Shirts 02:02

Transcript

📝 Edit Transcript

Changelog

Play the audio to listen along while you enjoy the transcript. 🎧

So we’re hanging out with Nick Janetakis. He’s flying close to the Sun, with only 2.5 gigabytes of hard drive space. Nick, do you like to live dangerously, or what’s going on over there?

Yeah, I must say I do.

[laughs] You must. I’m over here sitting on like three and a half terabytes, I think, of available space, so…

You know, at this point I’ve gone all-in with this idea of “I’m going to keep this workstation alive until it no longer wants to be alive.” So I’m at just under 10 years now, with the same like first-generation SSD.

So what’s the ultimate size on that?

Well, the SSD is 250 gigs. I do have a one terabyte hard drive as well, just like an external one, but that’s also getting pretty full.

Is this a system you built yourself?

Yeah, just assorted parts off of – well, back then [unintelligible 00:04:38.19] a little bit of Amazon.

What’s “back then”?

Back then? Like 2014…

Dang, that’s how old this machine is you’re on?

Yeah. I almost can’t believe it too, because it’s like, you know, I could buy a new one if I want to. Just put it out, build it. It’s fun. But it just hasn’t become a problem somehow. I can still record videos, and day to day usage… Yeah.

What’s your CPU?

It is a quad core 3.2 gigahertz. It’s like an E4460, I think. An Intel one.

You’re missing out, man… Sorry about that.

[laughs] Yeah, the last decade has been good in hardware advances, you know?

Yeah. Wait until you hear I have like a GeForce 750Ti as my video card.

Oh, my goodness…

That is an interesting one.

Yeah, I suppose. Well, you know, the new Intel CPUs generally have integrated GPUs, which is enough in most cases, really.

Nick wouldn’t know.

13th gen just sitting out there, waiting for you to get it. I mean, 14th gen is out there too, but riddled with Linux bugs, I’m sure, because it’s latest gen.

I’m excited for you, Nick, because a) we might kill that machine here today, as we fill up its hard drive… But b) you’re gonna have the best upgrade of all time, aren’t you? I mean, it’s gonna be amazing.

It’s gonna be a good day.

That’s like how Adam starves himself all day, for that one meal… But that one meals the best, isn’t it, Adam? I mean, you really go after it.

You know, man, I have to tell you, I’ve been becoming a chef.

Oh, yeah.

Oh, yeah. That’s all I’ll say.

I believe it.

[laughs]

Nick’s gonna be a chef when it comes to building a recipe for his next machine.

Nick, I’m half-tempted to donate some RAM to you or something, bro.

Well, don’t worry, I’ve got 16 gigs…

Okay. Well, you’ve got plenty of RAM. But does that RAM scale to your next system? What gen is that RAM even?

I couldn’t even say the exact gen of the RAM, but the answer is no.

This kind of reminds me of my very first MacBook Pro laptop, which was probably around the same time period… No, it had to be before that. 2010. It was one of those big, heavy honkers, with a really nice keyboard… And I had a similar streak going; not “How long can I run this thing?”, but “How long could I go without rebooting my laptop?” At the time I was traveling into the office to work every day, but I would never turn it off. I would just close the lid, and open it back up, and I called it a server… And all my colleagues thought I was a dork, and I was. But I went over a year without rebooting that thing… Which, by the end of it - I mean, it was doggin’. It was swapping, the RAM was gone… It was like “Please reboot me.” But once I had the streak going, I didn’t want to break it.

Yeah, it’s weird how streaks work. I had something similar happen with this machine actually… So this machine predates Windows 10, which is what I’m running now. I used to run Windows 7 on there… And you know, at some point in time security patches stopped, and I wasn’t getting autoupdated from Microsoft all the time… So yeah, I had something like 230 days of uptime, I think, on the machine. For a Windows box it’s pretty decent, because usually Windows will be like “By the way I’m going to reboot on Friday, and the next Tuesday…”

Right… On Tuesdays.

Was it Tuesdays? It’s been so long, I forget.

Patch Tuesday, isn’t it? Isn’t that the big day on the Windows side? I believe so. Nick knows.

Yeah… I’ve got an idea for you though, Nick… You’ve got enough followers and subs on YouTube. I would – I think you could probably put a call out there for like hardware folks… You know, get Fractal Design to give you a case. Get so and so to give you a motherboard. Get so and so to give you some drives. And one brand only, of course, I’m sorry. I like Fractal Design. They’re cool.

So you want me to sell out and shill some company stuff?

[laughs] Yes.

No, that’s not selling out. That’s leveraging your channel, bro. You’re missing out. There’s good content waiting for you to build your next machine. All the choices you’ll make as a Bash scripter, a Vim master, a Docker dude, whatever you want to call yourself. I’m just looking at your – I’m looking at all your keywords on your YouTube channel… You’re missing out, man. Build yourself a new machine, use this promotion, get some friends, get some network… Boom.

[00:08:44.19] So here we go. YouTube video title, “How to pick the best motherboard to run Docker.”

Yeah. I mean, I don’t think you really need to choose between motherboards to run Docker, do you know?

Okay, then. Okay. Just whatever is on the market. Anyways, you should do that.

It’s an idea. It’s an idea. I don’t think that’s exactly Nick’s style of content. You’re more tutorial, learn a thing, opinion pieces… Right? I’ve even seen you kind of reading some of your blog posts now on YouTube. Is that a recent thing you’ve started doing, or have you been that a while?

You mean linking to the blog post from YouTube?

No, it’s like “Here’s a blog post”, and there’s also a video. And the video is effectively you either reading or summarizing the blog post. I mean, it’s almost like an audio transcript in video form. And they link back and forth.

Sometimes, it depends. Certain posts I will write out beforehand. But a lot of times I’ll just make the YouTube video first, and then I’ll just do the blog post after.

Oh, I see.

But yeah, some of them it makes sense to write it first. But yeah, I’ve been doing that style, I guess, maybe for like a year and a half, I want to say. And I was just figuring “Well, it’d be interesting to see if that increases traffic to both sites, both YouTube and my own site”, just by having a little bit more content on my site.

Right. Have you had any good results from that, or are you –

So it’s hard to tell. Hard to tell. Because I also disabled Google Analytics, so… Whenever they switched over.

Oh. Which I don’t blame you about, but… But how are you going to know?

I don’t know.

[laughs] Alright… Alright… Maybe just a feeling. Like, you’ll feel like it’s worth it. That’s how I go on stuff a lot. I’m like “This feels right.”

Isn’t there a plot hole we’re missing on here, Jerod, though? The last time we talked to Nick, he was changing. He was like ending the podcast… I think even ending the blog, and like moving on to something – like a gig. Ain’t that true?

I don’t know, man. It’s been so long that I don’t remember it. Yeah.

Yeah. No, you’re right about the blog. Or, sorry, hold on… You’re right about the podcast, because I was running runninginproduction.com for a while. I did 100+ episodes, and then just decided to call it quits on that one. But yeah, the blog and the YouTube channel, they’re still going strong. Weekly posts.

So you haven’t changed at all.

Since then, no. Interestingly though, I have done a lot of contract work… But one of the people I was working with, they did invite me to work full-time, as like an SRE/DevOps engineer/Developer Advocate/whatever you want to classify that role as.

The do-all-the-things person.

The run-things-in-production person.

That’s right. Oh, man. And how did that go?

Yeah, that’s actually going pretty good. It’s interesting, because it’s like a nine to six type of job, but it kind of feels like – I was working similar hours, doing contract work beforehand anyways, and now it’s just like consolidated into one company… Which has its pros and cons. If the company decides to lay you off, or something happens, you only have one revenue stream… But so far, so good.

And you have courses still in play? Are you still doing courses, or no?

Yeah. Keeping those up to date. Still need to make some new ones… There’s been a Deploy course in the works now since like 1935, but…

Older than your computer.

You might miss out, because there’s a lot of non-deployment happening. People ain’t shipping.

He’s slowing down, because he can’t – he has to slow down to keep up with his computer. He just can’t go [unintelligible 00:11:55.14]

[00:11:58.07] That’s right.

Do you have any pain from that? I mean, you’re rendering videos, you’re doing stuff… Are you ever like “I could wait–” I remember when we upgraded to the M* – I think ours are M1s. My mixdown inside of Adobe Audition went from like four minutes to like between 30 seconds and 45 seconds. I mean, it was enough where I don’t get as distracted now as I did… Because you’ve got to waste five minutes waiting for that thing; especially when you mess up, and you get a remix down. But do you have any of that, where you’re like “Man, I’m just literally watching this thing spin for –” Video takes even longer than audio, obviously…

Right. No. If that were the case, I would have upgraded a long time ago. So you’re right, definitely the video encoding is gonna be so much faster on a new machine. Probably like a 10x difference. But let’s say I record a 15-minute YouTube video, and maybe that takes like 25 minutes to render… You know, I like to walk a lot. I also sleep and eat meals and stuff, so I’ll just like render that video when I know I’m going away for an hour.

“I also sleep…” [laughs]

During his encodings he takes a nap, you know?

This is the exact reason why people upgrade.

I spent my whole – my whole life is optimized around me doing different things when I need to render a video.

[laughs]

Oh, yes. “Am I rendering? Okay, cool. Time to do X.”

It’s like a forced Pomodoro technique. It’s like “I’ve got 25 minutes. I’ve gotta go.”

I’m the same, Jerod. I have the iMac Pro at home as my kind of work home desktop thing that I use… I thought I would use it a lot more for like “Okay, I don’t have to go somewhere else and basically just do my work.” I don’t have to go and record, so I can just edit the show here.

Nah, man. On that Intel Mac, the mixdown was like –

Too slow.

…15 minutes. Unbearable. 15 minutes? No, thank you. When I can like spend a minute and a half at most on my M1 Mac. Forget it.

I know.

This is a maybe a controversial take, but this work computer that I have too is separate. So the company issued me an M2 Air, which is actually quite nice. It’s super-speedy. It’s cool. But it’s like, if I’m just browsing websites or doing like a Docker compose up, it’s really not that much different than my current machine.

And I really feel like having an SSD on both of them makes such a big difference. Like, if I didn’t have an SSD, forget it. It would be like the end of the world.

Yeah, you’re probably not doing a lot of compression… But I would say your video work is what would really tax the GPU particularly, and then probably the CPU as well, with some of that at least.

Yeah, certainly we’re at a point now where common internet usage - you’ve got your Vim, you’ve got your terminal, you’ve got your browser, maybe you’ve got a music app running… You’re not really gonna have much of a difference on brand new hardware versus - I guess in your case 10 years ago. Although when you did get that put together, it was pretty bleeding edge, it seemed like, or at least pretty good… Versus like an old machine that was also low-quality at the time. You’re not going to notice as much. I mean, there’s little things where like you tab away and you have to wait for like the window to actually swap, those kind of things… But really, where the gains are is if you’re doing heavy loads. Compiling, test suites…

Our test suite also runs now again in under 10 seconds, I think… Whereas on my old one it was like getting up to 30 seconds… Which, of course, you run that often enough that you’re sitting there staring at it. The old XKCD – the obligatory XKCD. I think it’s 303… Where their excuse is that they’re compiling, and of course, it’s why they’re having a sword fight in the hallway.

They’re sword fighting, yeah.

So those are the things that you’ll notice. But yeah, I mean, if you’re gonna go take a walk… I mean, you’ve got – I call that a workaround. But it’s a lifestyle workaround, so it’s the best kind, right?

Yeah. And it’s funny too, because – like, let’s say I were to release a new course. A new video course, that has like 75 videos that need to render. Those I’ll just start out before I go to sleep. I do sleep a good seven, eight hours most nights, so by the time I wake up, they’re all done. It’s like a gift just waiting there. All the videos. I didn’t have to do a single thing like waiting around.

Does it ever fail in the middle of the night, or do you ever like realize you made a mistake, and then you’re like “Ah, I’ve gotta go to sleep again.”

Gotta sleep again? Yeah.

[laughs] Go back to sleep.

[00:15:59.28] No, I’ve never had a batch fail like that… But – I mean, if it did… It is interesting though, because if it did fail, and I was planning to launch two days from now or something, that would have an effect. But yeah, another quick use case just around upgrading - I mean, yeah, I would like to play a little bit more modern games… So I actually do like playing video games. You know, [unintelligible 00:16:17.27] MMOs, FPS etc. And nothing modern, within reason, is going to run on my current machine. So I’m stuck to playing these 2D platform games.

Well, I’m in the same world as you, because I play all my video games on a Nintendo Switch, which is not modern hardware… Because they refuse to ship modern hardware. Nintendo does. And so all the games that look silky smooth on Xbox, they’re all glitchy on Switch. But you know, it’s nostalgic, and it’s Nintendo, so I just live with it.

Yeah. Actually, here’s a dilemma for you. My biggest dilemma around the next upgrade is like “Well, do I actually want to go with another workstation that I build up from parts, run Windows with WsL, et cetera? Maybe doable with Linux, or something…” Or does one actually go with a laptop, and then it’s kind of like “Well, you can do everything from there.” I mean, parts are going to be a little bit worse, but you have the convenience of actually having the laptop. Because man, did I run into some issues when – so Docker had this Captain Summit in Lisbon, Portugal last month… And I don’t have a dedicated laptop, but I have this Chromebook that I modified to run Linux. But that’s also like 10 years old, literally, and it can’t even run Docker Desktop… And it just became annoying to like sync files from my workstation onto there, so I can like post a blog post from there… So yeah, I don’t know. Where do you guys stand on that? Do you like this idea of like one machine to rule them all, you do all of your work and fun and all that? Or do you have separate ones?

Great question. So I think Adam and I differ on this, to a certain extent… Go ahead, Adam.

I’m pro laptop, honestly.

Then I’m wrong. We do not differ. [laughs] Well, you always had a desktop, for a long time.

Yeah, I did, but mainly because the iMac Pro was the latest thing you can buy that was good, I suppose, at that era of Mac… And it was a desktop. And that was why. I wanted a larger screen. Larger screens were not really a thing for Apple at the time. I think they still had like the old school display, not even with the newest stuff… And always, any sort of external display with a Mac has, as you know, Jerod, been generally fraught with issues throughout the years. It’s gotten better, but it’s not like native. When you have a native screen, the laptop screen or the iMac Pro screen, or the iMac screen, it’s good.

So I’m all for a good laptop, honestly. It goes everywhere. It just sucks going from screen to laptop, because the stuff moves around; the windows move around.

Oh, yeah. Unplugging and plugging…

Yeah. It’s my biggest – I mean, how has Apple not solved that yet? Why is it a third party tool that works okay solving it?

Right. So yeah, I’ve been pro mobility… I have had a desktop in the past, but I’ve always preferred a laptop. And that to be one machine to rule them all. I just get the beefiest laptop I can… I err on the side of big, versus pure mobility, because the difference, especially now, between the Pros and the Airs or whatever is miniscule. I mean, it used to be more epic, as the pros were just like these huge honkin’ bricks that you really didn’t want to put on your lap, because they would heat your lap, [unintelligible 00:19:14.01] to a point… But they’ve gotten so good now that I just don’t want to have multiple machines where I have to worry about syncing, and installing stuff here, installing it there, and “Did I do this there, or that there?”, blah blah blah. And I certainly can’t do my work only at my work desk. I just – my lifestyle doesn’t afford that. So I’m a laptop guy. Laptop for life pretty much, at this point.

Okay. Yeah, I’ve always been just “build my machine up from parts”, but maybe that’ll change, or maybe I’ll get two machines. I don’t know. Maybe a new workstation and a laptop on the side.

Well, you get that YouTube series going and you might get so much hardware it’ll be coming out your ears.

[00:19:58.29] You know, funny enough, I have had one opportunity to get hardware, but it was for one of those… It was like an exercise bike. But like a really fancy one. A crazy one, with a big screen, and everything…

Like a Peloton kind of thing?

Something like that, but it wasn’t that brand.

But it felt weird to accept something that large, physically, and money-wise value, to be like “How does that relate to making a YouTube video on how to write a shell script?” You’ve gotta know how much of an audience crossover there is.

I’ll tell you how… I’m sure there’s embedded Linux on that thing.

That’s very possible.

Right? Let’s hack that thing. How can we check its outgoing IP lookups, and stuff like that? Let’s look at its DNS lookups. Let’s actually hack it to make it not a bike.

Then you find out that it’s phoning home, and it’s tracking everything you’re doing right, and you can bust them.

That’s right. [unintelligible 00:20:46.01]

“They sent me this free bike, and now I’m debunking them on their privacy problems.” That’s how you really get the views, Nick…

That is.

There we go.

So just call us anytime you get new hardware opportunities, and we’ll give you ideas to do or to not do.

All kinds of stuff that we never do either.

No, we don’t. But it’d be fun. Peloton, send me a bike. I’ll hack it.

There you go. Well, let’s dive into our topic for today. This is a follow-up to the last time we had you on, which - it has been a few years. But we talked modern Unix tools… And that was a lot of fun, going through a lot of the common Unix tools, like ls, and cd, and cat and etc, etc, etc. And talking about modern alternatives to those, which have bells and whistles. So that was that episode; people can go back in the feed, episode 451. We will link it up. “Modern Unix tools, with Nick Janetakis.”

Today we’re going to talk terminal again, or focus in on TUIs. I feel like TUIs are having a moment, a – I won’t call it a revolution… A renaissance. There you go. A renaissance. Probably in light of a lot of the tooling that’s now available. We’ve had shows with people like Charm, the Charm Bracelet folks, who are providing Go-based tooling for doing all kinds of text-based and terminal things… And then there’s also - is it Will McGugan, I believe, and the Textualize folks, over there providing similar tools for the Python community… And a lot of the stuff that we’ll talk about today is built with Textualize. And then there’s also something going on in the Rust world, with a toolkit called Ratatui.

[00:22:44.25]

And the truth is, I have no talent at all. But this rat, he’s the one behind these recipes. He’s the cook.

Spectacular name, by the way. I’m gonna grab that one and throw it in my notes real quick, because I’m compiling a list of the best open source puns. And of course, that’s a reference to the movie, or maybe just the dish. Or both.

But it’s a good pun. By the way, if you’re listening and you have a good open source project pun that makes you laugh, giggle, or at least smirk whenever you hear it or read it, send it my way. I’m putting together a blog post. But Ratatui in the Rust world is a Rust crate for cooking up - ah, doubling down… That’s their words, not mine. Cooking up terminal user interfaces… And of course, its little mascot is a rat-looking chef. So a lot of the tools that we’re seeing also are written in Rust; it’s the reason why I bring that up. So like Ratatui is powering this movement, Charm, and Textualize perhaps more. Some people are just old school, building up ncurses stuff, hand-rolling their terminal or text-based user interfaces… But lots going on.

[00:23:56.15] So there are so many TUIs now… In fact, we went out to the Awesome TUIs repo, which happens to be maintained by Ship It host Justin Garrison. I didn’t even realize that when I first loaded it up, but I do know Justin is super-into text-based UIs. And if you just look at that repo, and scroll it… Holy cow, y’all. There’s hundreds on there. And those are just the ones that have been submitted. So that’s kind of the topic for today. We both have, or we all have brought some TUIs to the world, to the show, to discuss… But let’s start with maybe TUI, maybe not, but terminal tools, tips and tricks that we’ve been using, or are using, or know about, that we could share with each other and with our listener. Nick, starting with you. I know you are a command line junkie.

Yeah. So just general tips?

General tips, or maybe a tool you’ve been using recently, or something you’ve learned… Anything you want. Open book.

Yeah, it’s kind of funny… When it comes to solving these business problems that sometimes get thrown my way, it always comes back to like grep, sed and cut. Those three tools combined can solve so many random things that might come your way.

For example, just a quick use case… You know, the business came at me and they’re like “By the way, we have this Salesforce dump of 178 CSV files”, and it was like 30 gigs of data. So we have – let’s call 180 files, a lot of data there, all with different columns, all with different rows, and it’s like “Well, now we need to import that into a MySQL database.” And if you try to do that by hand, what are you gonna do? You’re gonna have to make like 8,000 different columns, and so many different tables, 180 of them or whatever… But yeah, I just threw together a little bit of shell scripting, and like 30 lines of code with like sed and grep and cut and all those combined, and we had a solution that got us 95% of the way there. It just autogenerated the CREATE TABLE syntax, and auto-filled out the columns with like [unintelligible 00:25:52.02] var car 55 by default, and then someone can go in there by hand to modify things as needed. And it worked out real nice. So yeah, just random, random stuff like that.

Yeah… I mean, that’s the beauty of Unix tools, is just the composability, like little functions do one thing well, and then the combining of them. Like a good chef, Adam; you know, put together different ingredients, and come up with an amazing recipe…

That’s right.

…that may be a one-off, maybe it’s something they should wrap up and share with the world, but… What’s the movie where Adam Sandler is a chef, and he goes home to make himself a sandwich at one point?

Yeah, what was that movie…?

And it’s just like an egg sandwich, but because he’s a world-renowned chef, the way that he makes himself a sandwich for lunch is still just like mouthwatering. You’re like “Oh man, how cool would it be to be that good at cooking that even your throwaway lunch sandwich is just like droolworthy?” Maybe Spanglish?

Spanglish. It was English. Yeah.

Awesome. Came back to me.

Good movie. A really underrated movie, honestly. I think it’s a solid, solid movie. A lot of good acting in that movie, in my opinion.

I like that one. Nick, that’s definitely good use… Grep, sed and cut. I was doing similar things with our Frontend Feud survey results… So we used Typeform to go out and ask people a bunch of questions… And because they are freeform - this is for like Family Feud. Are you familiar with the game, Nick? Family Feud?

Survey says yes.

Yeah, totally. And so because it’s “Survey Says”, the whole point of it is the form has to be a text box. It cannot be a multiple choice, because that ruins the entire point. Like, what would people say? And they have to be able to type whatever they want. And so we use Typeform just to collect the entries, and then I download a CSV inside Typeform; I’m not going to just read through all these and tally them up by hand… And so for a long time I had this process where I would open up the CSV and numbers, and then I would scrub and normalize and try to do some stuff… And then I’d export it back out to a different CSV. And then I would use – then I would import that CSV into a SQLite database, and then I would use the SQLite command line to go inside there and query it.

[00:28:10.17] And then I realized - or I was taught by somebody; it might have been Simon Willison. I can’t remember who taught me… That SQLite actually has a CSV mode, and in-memory mode. And then it also will take queries directly from the the command line, so you don’t have to go into like little SQLite UI, and do things from there. The prompt.

And so I reduced – this is not multiple tools together, but this is like just knowing a tool better… I actually reduced that entire process down to a single command line, that would take the original CSV from Typeform, open it in memory, in SQLite, as a CSV, which automatically creates the tables right there and everything, and then execute this specific query, and then output it the way I wanted to. And I was like “Oh, happy day.” When you have something that just works like that, it’s amazing. You’re just cutting down five steps to one; you feel like you’re superhuman.

Yeah. No, I love stuff like that.

Break: [00:29:11.06]

As far as tools we’re using it, I’m still rockin’ Atuin. Adam, are you still using it, Atuin?

No. I don’t have a need for it, I guess.

I use Warp as my terminal, and it remembers a lot for me.

Oh yeah, you’re using Warp on the terminal. Nick, do you know about Atuin?

No. Is it an actual – like a terminal, or something else?

Atuin is a history tool. So it replaces Ctrl+R, and the up arrow, with a better interface fuzzy search, a bunch of stuff that is basically like your terminal’s history on steroids, so to speak. And we did a show with Atuin’s creator, Ellie Huxtable. Yeah, we did a show with Ellie Huxtable, and it’s one of these tools where it kind of disappears into the background. It’s not like front and center. Because I’m never actually typing the Atuin command. It’s just in there, in my history, and you invoke it via things that you’re already invoking; you know, if you’re Ctrl-R-ing to search, or just arrowing up or down to find recent commands. And I’ve installed that - I think that was like a year or so ago, and I’m still rocking that. I definitely am not going to uninstall. It’s just small quality of life improvements over the default Bash history, or ZSF history.

Oh, yeah. It’s interesting… I forgot the name of that tool, but I’m pretty sure I vaguely remember it now from like a Hacker News post from some time ago.

Yeah, it’s pretty well beloved. It’s one of those things that just kind of makes your life better, and doesn’t ask anything of you, and so it’s like “Why not?”

For sure.

Let me ask you this. So I like using Ctrl+R all the time, and I happen to use FZF for searching through my history like that… Which could be classified as a TUI to some degree, because it is opening up a little interface that you can interact with. How does this tool compared to FZF? Have you tried both side by side, or in general?

Not side by side, but I did use FZF for a little while… And you’re gonna find very similar fuzzy finding with Atuin. It’s a little bit better-looking in terms of like she’s taking more time to make sure that the UI is nicer than I think FZS’es. And I know you can tweak that and customize it… But it’s really kind of a no step similar functionality. So with FZF this is like a thing that you go into somewhere and make sure that in your Bashrc or whatever make sure that when you Ctrl+R, FZF gets invoked. And there’s some steps to set up, right?

Yeah. And then on top of that – I mean, if you’re talking about history stuff, there’s many different Bash or ZSH settings that you need to configure just to get your history set up so that you can see 50,000 lines’ worth, and other things like that.

Yeah, exactly… Which - I had done all that stuff, because I didn’t know about Atuin until a year ago… And so if you already have all that stuff set up with FZF, you’re gonna have a very similar fuzzy searching of your history with Atuin as you would with FZF.

Atuin does bring a few other things to the table, like stats, and… I don’t know, when you up-arrow, are you having fuzzy search inside of the history there? Or like, is FZF invoked at all in you’re up and down arrowing through your history? Or is that just the standard Linux one?

No, if I’m just hitting the up arrow in my shell it doesn’t invoke FZF. I mean, there might be some custom key binds to do something with that, but I haven’t set that up.

Yeah. So that’s one thing about Atuin, is even when you up-arrow - I’m sure you probably turned this off - it will invoke the Atuin UI, which you can just continue to up-arrow like you normally would, except for you also then have that same fuzzy search functionality as you would with Ctrl+R. And so sometimes you’re not thinking about Ctrl+R and you’re just like up-arrowing, and you realize it was like “Oh, not that version of this command. It was a different one.” And then you can start to like narrow it down. So it’s just slightly more tuned into that. But other than that, I think that the experience will be relatively similar.

Right. Yeah, I just tested this now… So if you just go to your terminal with FZF and just hit Ctrl+R, that will bring up your search history there, and then you can kind of up and down through FZF’s window. But you still need to invoke it with like a Ctrl+R.

Right. So for folks who already have that configured, probably not a big win. But for people who are new to the terminal, or didn’t know about FZF and how to set up the right environment variables to get their Bash or ZSH history to be 50,000 lines or whatever, installing Atuin I think is an easy one step that does all those things for you.

[00:38:05.13] So let me follow up with one more question about that…

So one interesting thing when you’re dealing with your shell’s history is if you happen to be using a tool like tmux, and you have multiple sessions and panes and windows running, how does this tool let you have a unified shell history between all of them, without things getting out of date, or commands not being in the right order when you want them?

Yes, so that’s one of the core things about Atuin, is its unified shell history. Not just across your tmux sessions, but actually - and here I am with one computer, so I don’t really get to live this life - but across all your machines as well. So that’s one of the core things that Ellie is doing that I don’t really care about as much, because I just have one computer… Is like you could have your shell history and synced across all of your machines via an end-to-end encrypted sync service that she provides. But I don’t really know how I want that to work sometimes, honestly. And there’s moments where I’m like “Oh, I typed this command into another tmux session”, and I would love to just up-arrow and type it here… And it’s not there. And then there’s times where it is there, but I don’t want it to be there… I’m like “Actually, that was contextual to another thing. I don’t want it in this little shell history.” I mean, I am of two minds about how I would actually want the feature to work. I think it’s not straightforward. Have you had that experience?

Very much, and it’s very not straightforward… Because it almost feels like the only way to solve this in like the best way possible is like just do what I want.

[laughs] That’s what I wanted to do as well, but I don’t know that the computer knows what you want is the problem, you know?

Like a mind reader… Does it say things like as if you ls-ed and then with some flags a particular directory? Is it keeping the base command plus flags plus directory in its history too, so that when you re invoke it it’s like “Well, I want the ls command with these flags, but not with the argument”?

It’s gonna be the entire command.

Yeah, that’s kind of painful.

So you might have to like up-arrow, select it, and then you can hit Tab or whatever, and then you can like delete back, and stuff like that. You can probably do a quick shell expansion thing with the exclamation mark, and that kind of stuff, which is obviously more Kung Fu, and things that I can’t remember how they work all the time… But yeah, it’s not smart enough to know “I just want the flags.” I liked that version of ls, but now I’m doing it in different contexts. I want to change the path, or use no path. I think you can have it to just do that stuff manually.

Yeah. This is where I like Warp. I don’t know if it has this feature, because I do use a few machines, but so sparingly that I forget what I’ve done the last time I used it. And so Warp, at least on a single machine - I think you would appreciate this, Jerod, and I know you already use Atuin - is that it does that. So I’m just tinkering on this spare Linux VM I have on Proxmox, because hey, I’m on a podcast talking about TUIs, so I’m gonna install some right. And I want to do it in a way where I can just blow it away, and there you go.

And so I’m logged in and I’m just like “Well, what are some recent commands, just to see if they’re there?” …because I know they’re there. I know how Warp works, but just to see if they’ve actually followed me, even into this different machine… And of course, they’re there. So I have that same feature because of the terminal application I’ve chosen, versus this sub-thing… And I think the one thing that I think Warp is driving towards - and this is zero an ad. They’re not even sponsoring us. I just like them, and Zach’s cool, and I like his team… And I believe it is a version of the terminal the future. There you go.

[00:41:42.07] I think that they’re doing things like team features, which I think would be cool because you can log into Warp and let those things transfer via their cloud service, if they do that. I think that’s what they’re driving towards. I wish they would do that more so as settings, because going between machines - it doesn’t have that. Whereas another tool I use daily is Raycast, and it has that where it cloud-syncs settings. It doesn’t cloud-sync clipboard history and sensitive things. It’s doing things that – like themes, and stuff you really want to have unified between machines. That’s kind of how I look at these tools… Like, even though we’re talking about TUIs, I still feel like Raycast and Warp are kind of similar in that respect, because they’re a layer above the need for a TUI because the application itself has the things in it it needs to give you that history.

There’s other stuff too I’m not even using, like expansions, and snippets… Things I’m not even like – I don’t know, I don’t even know how to use them, honestly. I think some of the tooling –

Does it support tmux?

Well, I really wish, maybe – I haven’t dug into their documentation to criticize it… But even Raycast, they’re doing a great job with teaching you how to use the tool. Because there’s always these hidden features. I think h1 probably could do this as well… Or basically any tool that has hidden features that are not easily discoverable. Because the Jerods of the world will just be happy with the defaults that you’re given, and not all of the expressiveness that you can achieve if you would just tweak a few things… And maybe Nick is the kind of person like “Let me tweak this…”

Nick knows all [unintelligible 00:43:13.01]

“On this super-old hardware, by the way, but let me tweak this.”

[laughs] Yeah, exactly. Now, Nick definitely knows all the command line flags. Don’t you, Nick?

Some of them…

“Some of them…” [laughs]

I mean, he’s written them down, at least. They’re on his blog, they’re on his YouTube. He may forget them, but he can always – they’re a Google search away as long as Google search continues to index our content. But that’s a different topic. Yeah, I mean, Warp is cool. I love people trying to reinvent stuff, make it better. As soon as they get tmux support, then maybe I can give it a try. But until then - and it sounds like, Nick, you’re probably with me - I’m just not going to use it, because I live inside of tmux, pretty much everything I do.

So that’s the rub with trying to replace a lower-level foundational part of the stack, whereas Atuin is like a history thing; it’s a smaller subsection of your terminal, is that you have to support all these different things. And there’s a long history of weirdness inside of terminals that is just difficult. And so until then – or they convince me they’ve replaced tmux with their own functionality, that is better than tmux, and provides me all the same things that tmux does… I think that you can probably get that done. I’m a relatively vanilla user of tmux. I’m not an advanced tmuxer. But that’s an education problem, right? They have to be able to teach people that they’ve done that.

Yeah, I agree. I’ve never been – I’ve used tmux several times, but I’ve never been like “Oh, this is the way.” I never sat beside somebody either, or like pair-programmed, or pair-terminaled, which is probably different than programming… It’s just like “Let me just see how you hack…” To really be like “Oh, well, I’m really missing something with tmux.” Like, I’ve used it. It’s kind of kludgy in some cases… But maybe that’s because I haven’t gotten past that - even like the Vim stage. I’m a fairly daily user of Vim, but very basic user of Vim. Even getting to the end of lines, or jumping lines, or copying multiple lines, or even yanking and pasting… Those are the – I’m doing basics. I can at least get out of it, so thank you very much. But with tmux, I’ve never gotten past the whole training wheels, let me actually find usefulness, because - well, I guess I just haven’t.

Sure. Well, Nick, you’re a tmux user, right?

Give Adam the pitch.

What’s the pitch?

Okay. So if you like to use the terminal - let’s say you’re using Vim, or whatever editor, and you’re running a whole bunch of different command line tools, maybe TUIs as well, and you don’t want to leave your terminal to juggle multiple projects… I mean, you can use something like Tmux Sessions to have – let’s say maybe if you’re working on the Changelog source code, or maybe you have your own personal blog, or maybe you have a different project, like a side project that you’re building, you can have a tmux session for all three of those things, and then use tmux to jump between each of those.

[00:45:59.28] And all three of those sessions, they might have their own window layouts that are specific to that application. With the Changelog source code maybe you have your code editor in one window, maybe you have a Docker compose up, or however you run your application in another window… And then when you jump to your own personal blog, it has its own set of windows. So you can kind of switch between contexts very quickly, and have everything just ready to go right there for you, without having to be like “Oh, I’ve gotta open up my code editor, and split this window, open up a second terminal, and then do all these things.” That’s typically how I use tmux in my day to day, just to help me juggle a lot of different things… Because I have probably like 11 or 12 different tmux sessions, basically 11 or 12 different projects… And yeah, they’re all laid out a little bit different.

I mean, tmux makes it super-easy to like if I just want to open up a second window, or split a plane vertically, or horizontally, I can do that type of stuff, and jump between those hotkeys… Like, if I want to go to window one, or two, or three, that’s just a hotkey away.

Yeah, I’ve been there to do some of those things. I definitely am not a daily driver in the terminal where I’m effective and efficient on the daily. My work is generally outside of that; my tinkering is more in it… So I haven’t found the need to be like “Let me obsess over the tooling” so much. What’s wrong with multiple tabs?

Well, you have to set them back up again.

I have to go. See you later, guys… [laughter]

I had to ask the question, because somebody out there is like “What’s wrong with multiple tabs?”

You mean like just your terminal has multiple tabs open?

Yeah. Just like a new tab. Exactly.

Well, then you have to set that back up again later.

So that’s the reason, is like the setup, the teardown.

So let me give you an example that maybe would be enticing for you… Because you SSH into local boxes –

Multiple machines, yeah. Exactly.

So this is less of a problem as it used to be, but SSH sessions which have not the best internet – obviously, on your LAN you’re gonna have good connection all the time. But anytime you’re like SSH-ing into a remote server where you may hang, you may have an internet outage, you may lose that session - this starts with GNU Screen. It goes way back. But tmux has its functionality as well. What you can do is you can SSH in, you can start tmux inside that remote machine. You can have multiple panes, multiple things, all the stuff you could have like [unintelligible 00:48:05.18] tabs on your own computer… But then you can also detach from that session, and it stays running.

And so you can set it up so like if you accidentally close your laptop, and you’re like “Dang, I had three tabs open. SSH into this machine…”

Right, moving files around, doing different stuff. Yeah.

…now you basically just lost the connection to all that setup, which is still live on that remote server. So the next time you SSH in, you just tell tmux to connect to that session you had going, and everything’s magically back. So that’s a big win.

Yeah. And just expanding on like the magically back thing… So one interesting thing with tmux is you can have multiple sessions, and windows, and panes, and all of that… But by default, if you were to reboot your box and come back, all of your tmux state is going to be gone. You have to like start from scratch there. But there’s this really nice tmux plugin called tmux resurrect. I’ve been using this one for quite some time now. Let’s say you’ve got your tmux set up however you want. You’ve got your 10 different sessions, all these windows laid out… And now you can just hit a hotkey, basically your tmux leader, Ctrl+S to save it, and it’s going to save all of your sessions, windows and layouts to a text file. You don’t need to think about it, you don’t need to worry about it. And then when you reboot, all you have to do is just launch tmux, and then restore from your resurrected file - another hotkey for that one - and everything is back to just how you left it, to some degree.

I say “some degree” because it’s not going to reopen every single application and put you exactly where you were… But at least all of your sessions and windows and certain applications like Vim can be autostarted as well. So it’s a nice one. But yeah, I’ve been using that one for a couple of years.

You know, three years ago you mentioned the Save and Restore tmux sessions across reboots with Tmux Resurrect. This is on your YouTube. I’m just thinking like “Gosh, where could I dive deep into tmux? Like, where’s the good primer?” I mentioned I’m becoming a chef, and I’ve found some really awesome resources behind the scenes… I always have some sort of crazy hobby. And I’m actually getting really good at cooking. So good that I’m like “Now the cooker in our household, because it’s like such good good and our kids love it”, and I’ve been enjoying the process… But I’ve found some really cool stuff to teach me the first principles of cooking.

[00:50:08.00] Not just how to make a meal, but how do you sharpen your knives? What are the best ways to dice? What are the ways you should do different cheeses? How to do garlic, and pull it off the clove, and like make it a garlic clove that you can actually begin to slice, dice, mash, whatever. I’d like to have the same kind of idea for tmux. Help me, Nick, if you haven’t already done this - maybe you have; or point me to the YouTube videos, and we’ll put them in our show notes… But help me with a primer of like watching somebody. Because that’s what I think I lack personally, is I don’t have a good buddy next to me. And ChatGPT does not have this function yet, where it’s like “Hey, let me shadow you as a seasoned engineer that loves tmux.” When that becomes a thing, that’d be kind of cool. Until then, we’ve got the Nicks out there that have been slaying it on YouTube for years on this old hardware, just killing it.

Nick, surely you have a video about the fundamentals of tmux, or something like that, right?

I don’t have at like the exact fundamentals, like sharpening your knife level… But I do have like a use case-based one, to be like “This is how I use tmux in my day to day.” And I kind of demonstrate using the pains and the windows and sessions and Tmux Resurrect, and it’s like an eight-minute video or something; it was from maybe five years ago. But it’s interesting, because I would be curious to see if Adam can google for that topic, and if my site or page doesn’t come up, then there’s a problem.

What should I search? Tell me the search. I’ll put it in right now.

Well, that would be cheating. I want you to try.

Well, just give me the couple key – like “getting started with tmux.” Boom. Let’s see what’s there. Wow. Red Hat is first. GitHub tmux tmux is there, the wiki. [unintelligible 00:51:50.17] Linux Training Academy, a Hacker News post, Pragmatic Pineapple, Hostinger… Wow, Hostinger’s got some content out there on tmux, that’s ranking…

Sorry, Nick, you’re losing.

Let’s see…

I’m losing bad.

[laughs]

Shane Lee on YouTube… Now, I didn’t search YouTube, though. Let me take the same search and apply it to YouTube.

Well, the funny thing is I don’t even actually know the titles of those posts, because they’re from so long ago, but…

That’s okay, because here – this is probably a great example. So NetworkChuck obviously is first, because he kills it all on content. “This is something you know, RIGHT NOW!” It’s always RIGHT NOW in all caps with exclamation points. I’m like, “Please, that’s an old title. Let it go.” Let’s see if Nick is in the scroll. “Learn Linux TV” is in the scroll, “Dreams of code” is in the scroll…

You’re just getting different kinds of slayed here… He was slaying it earlier, and now he’s getting slayed.

The Primagen is there, Theo is there, Warp.dev is there, Shane Lee is there again… Where is Nick? Nick, oh, where are you, on your own hardware…?

[laughs]

Gosh… I do not see Nick in the initial page scroll.

Okay. I think I discovered why… Because I’m looking at this post now, and the title is so – this is a great aside on just how important naming your titles are… Because my title is “Using tmux sessions, windows, panes and vim buffers together.”

Yeah, that’s pretty specific on…

But the Adams of the world aren’t searching to be like “Oh, how do I use a window and a pane?” It’s like, you don’t even know what those terms might be if you’re just getting started.

Right.

“Teach me tmux. Getting started with tmux. Tmux for beginners. Why should I use tmux?” All those tmux phrases… Yeah, I agree, you have to think – this is part of user experience, though. This is part of product development. This the problem of all products, it’s the problem of all I guess startups, really, is like “How do you capture the attention?” Well, you have to think like the user. You have to talk to some people, you have to go on some podcasts. You’re doing that great. No problem. Good job. But you have to title and think like – and Jerod and I maybe don’t do this very well. Right? Do we do this very well?

We’re not a great example of titling well. We enjoy our titles. This is for the love of titling.

Yeah, we don’t title for that purpose, which is why no one finds us. [laughs] No one finds us for other reasons, Nick, but we’re okay with that, I guess.

So I’ve found another post from 2017, which is – this is more of a getting started guide. Like, it walks you through the basics, and everything. There’s no video for that one, but this one is “Who else wants to boost their terminal productivity with tmux?” Which is maybe closer, but still way off the radar of what a human being would search for.

Right. Boost your terminal productivity…

I bet you if you took an exercise and went back and retitled some of your videos – I’m not even sure how you can optimize your YouTube. But my assumption is if you can go back and revisit – either go back and update, or revisit some of these topics and create brand new content that is better titled, and more focused. Shorter form, more focused, compartmentalized… Time to content is super-crucial, no meandering, get to the point… And then make it a series. I bet you.

No meandering? We’re an hour in and we haven’t talked TUIs yet. [laughs]

Yeah. Well, let’s talk about a TUI!

Oh, love it…

I’ve got one open right now.

Alright, let’s hear it.

So Nick, on your list you had htop, which - I’m a fan of htop. And Jerod, I think we had the prior core committer of htop on the show…

Probably.

…way back in the day, when they got – yeah. I have here in front of me Bash top Bashtop.

Bashtop.

Bashtop. And I think it’s kind of cool, because the installation process is pretty easy. One thing it asks you to do is to do the apt – sorry, I’m on Ubuntu, so at least my process is this. And your mileage may vary wherever you’re at. But on Ubuntu you add the apt repository via this thing, I believe it’s called PPA. That stands for – Nick, help me out here… Personal Package Archive. And essentially, you’re adding bashtop-monitor/bashtop as an apt repository. So you can apt-update, and just do sudo apt install bashtop. And then it installs things like lib sensors, Python 3 utilities if you don’t have them in there, [unintelligible 00:56:15.00] and a couple others… And then once you get it there, you just simply type bashtop, and boom, you’ve got this beautiful thing.

What I like most about it is that it’s got super-awesome configuration. Theming, you can do a bunch of different changes to it… And one thing I don’t like personally, and why I prefer this over htop now, is one, it’s slightly more beautiful, and then two, I just hate how challenging it is to configure htop. The configuration file is not meant to be edited by the human, it’s only via the interface. And I find the interface kind of kludgy to fine-tune where things are at. Whereas Bashtop seems to be a bit more just, I guess, human-friendly on configuration management with it.

Okay, I’ll have to check it out. Yeah, it’s interesting, because with Htop - you know, it’s a tool I’ve also been using for a really long time. But usually, I’m reaching for it very occasionally. On my really, really nice work machine now, if I want to see if my CPU cores are pegged - all four of them, by the way - I can run an Htop and just see those little bars to be like “Oh, well, three CPUs are maxed out, the fourth one’s still doing good.” Or maybe I just want to see what is using the most memory out of a list of processes.

So it’s interesting that you mentioned configurability. In my mind, I would want to configure nice themes with tmux and everything, but like an htop, it didn’t even ever cross my mind once to like jump into its config to tweak it out… Just because usually I’m going in a very specific thing, and then like exiting out 20 seconds later.

[00:57:45.22] Well, let me explain to you… So I like to, I guess, the one thing I do that makes me pay attention to those, I guess, metrics more so than anybody else is I wanted to monitor my Plexbox for how well it’s using the RAM or the CPU during like maybe a 4k movie transcode, for example. Or on the TrueNAS box I want to pay attention because we compress our archives and put them into a file package called 7Z. And I max it out. I push the compression algorithm to the max. And so whenever I archive these things, it pegs my M1 Max CPU 100%, and takes the temperature to almost 200 degrees Fahrenheit for five minutes. And then it’s done.

It was kind of fun to watch. It’s just kind of fun, like you’re really pushing this beefy machine… And dang it, I want to see what’s going on here. I want to htop up in there. Or in my new case, bashtop. And so the one thing I do specifically on these kinds of boxes is I want to have my CPU stacked, I want to have them organized, I want to have my hostname there, I wanna have my uptime, I want to have my average CPU, my memory, my swap… I want these things there. I want network there, I want DiskIO there… And if this system happens to have ZFS, Htop thankfully has this other cool line item you can put in there for ZFS, ARC management, and just kind of knowing how your ZFS file system is working. So I appreciate that about that. But every time I’ve got to instantiate a new machine with new Htop, it’s not like one config that I can just move over from a Git repository or a copy-paste, it is literally a file you should not edit. I think they even tell you that. And from system to system, I tried to see if it made sense. There’s no rhyme or reason to this config file. So every time I do it, I have to do this brand new setup… Which is not too frequent, but it’s enough that I’m like “Forget it. I don’t want to do this anymore.” But I do keep doing it, because it has been the best. But now I’m looking at Bashtop. It has not won for me yet. It’s still runner-up, and it’s still winning… Or at least trying to win. So I haven’t fully adopted Bashtop, but I’m thinking that it might be a long-term better solution.

That makes sense. And it’s a great aside too, just around being really engulfed in your environment. You mentioned you’re running Ubuntu there… So I would imagine you’d be using Bashtop as like your full-blown like system monitoring tool; like an activity monitor, or whatever. Whereas me with Htop - you know, I am still running Windows with WsL, but I would just probably just open Windows’ Task Manager to see that information… Whereas for you, you’re using that one tool, so you want that one tool to be like “Yeah, I want to see network, and CPU, and all that, have it laid out the way I want, so I don’t need to tweak it.” That makes total sense.

Not to go one layer deeper, but there might be somebody out there saying “But what about Btop?” I agree, Btop is awesome. Except for Bashtop has more letters, and it’s slightly more awesome. There you go.

Well, I was just reading about Btop++.

Oh, nice.

Have you heard of this?

Do they like to increment, like us?

Yeah, I mean, I assume it’s better, because that’s what the Plus Plus means.

It is better.

It is better. It’s been better for years. It’s by the same author. Bashtop in C++. So Bashtop is written in pretty much Bash. I don’t know if that surprises you, but it’s 94% shell script, which I assume is Bash.

It must be tough to maintain.

Yeah. And now there’s a Btop++ is a C++ version of Bashtop. Now, switching from something to C++ doesn’t automatically make it better. I mean, I’ve heard that maybe C, in certain ways, is even better than C++. But one thing I’ll notice about the GitHubs is that Bashtop’s last commit was two years ago. Whereas Btop++ was committed to three weeks ago. So it seems like the author of Bashtop has switched their focus over to Btop++. So maybe give that one a look.

So I saw a release – I thought I saw a release on Bashtop that made me think “Okay, this is kind of cool.” I’m now not seeing it. There are no releases for it. Dang it…

[01:01:54.08] It’s alright.

This is data software? I’m pimping dated software? What’s wrong with me?

Hey, some old software is just good.

Okay, fine. You’re right.

I mean, how old is tmux…?

So this is a case where it would be – to find these tools out there on GitHub… Sure, there’s a username there. I could probably pay attention to the user who’s actually making the software and see if they –

The human, the actual human that’s writing your software for you and giving it to you as a gift?

That’s right…

[laughs]

This free USB stick at the front of their lawn, I just – I’ll just run by and steal it. Yet it’s free.

Right.

Well, I think there’s a dot connector that you’ve done, that I did not do yet, between the two, which is if it’s the same original maintainer/author of the software, have they moved on?

Which it seems like they’ve moved on.

Oh, man…

That’s alright.

So I should be using Btop++.

I don’t know if it’s actually better. I mean, it’s not Changelog++, which we know is better. But it might be. And I know that the author is still working on it. So maybe the big rewrite - sometimes it takes a while to come up to feature parity; it may actually be worse for a while, but have a better foundation. I am not a user of this tool, so I have no idea about the history… But let’s get him on the pod and let’s talk to him about it.

So it seems like /btop is now just Btop++. Did they just change it then?

This I don’t know.

Okay. So the same –

I’ve been doing my research while you’ve been talking, so I’m very shallow at this point.

You actually reached the end of my knowledge.

The person’s name is Jacob. I don’t know how to say your last name. We’re gonna reach out.

There you go.

It is interesting how fast developers will just like throw away a project they love, just because it hasn’t been touched in like 11 seconds…

Right. Adams’s like “You know what? Bashtop sucks.” [laughter]

Well, maybe Btop has the same principles, right?

Well, it’s literally the same person, so I assume it’s the successor to the tool you already love… And so check it out.

And nobody wants to buy last year’s product at the New Year – this product for this year’s…

Nick does. I mean, his PC is 10 years old, man.

That’s true. Gosh…

[laughs]

Alright, Nick, school us on going old. Staying old. Legacy.

There we go. It’s actually funny, we’re now however long it’s been on the whole entire show, but have we even defined what makes something a TUI, versus just a regular command line tool?

Great job, Nick. You should be a podcaster. Tell us.

Maybe. One day.

Do you have a definition? Do you have an idea? Do you want to hypothesize?

Well, okay. Let’s go zero research, top of my head. I mean, I would say a tool like grep, sed, cut etc. - this is a command line tool typically that you’d run. You provide it some inputs, it will provide some outputs. And the output that you get on your screen - it’s almost like a transaction. Almost like an HTTP request. Your request is calling the command; the response you get back is what you get back in the output there. And it could be like an image if you’re dealing with an image manipulation tool. It doesn’t need to be text. But a TUI, to me at least, it’s like something that’s just running. Like Htop; it’s just running, and you can interact with it. You’re still sending it inputs, you’re still getting outputs, but you’re kind of getting these little incremental updates on the screen somewhere, like in your case a CPU graph, or something like that… So yeah, I don’t know, in a weird way if you’re gonna follow that HTTP analogy or something, it’s almost like a WebSocket connection, where that connection is staying open and then it’s like broadcasting things back and forth. Or, you know, one way works as well. But I don’t know, do you guys have like a different definition of that?

Mine is slightly more simple. I would say I think a TUI is more application-like, whereas you open it and you have a brand new, probably bespoke interface that’s specific to its function. Whereas those tools or utilities where you’re sort of passing things around on the command line - they’re not meant to be TUIs. What does TUI stand for, Jerod, again?

Text-based User Interface.

There you go. I thought so. Not terminal user interface…

Not necessarily.

…text-based user interface. So I think they literally are a UI to a particular application. So I think they probably get started like a Bashtop, or a Btop, or an Htop, you just invoke the command, and it runs this application that has a particular UI, that matches whatever its function is… Whether it’s a markdown reader for READMEs, or an editor… VIM is kind like a TUI. It’s kind of like an application.

For sure.

Right? It’s kind of a TUI.

[01:06:08.14] For sure. Well, if you run it in the terminal.

Where else would you run it?

There’s VIM GUIs…

I don’t know about those.

In fact, Kris Brandow got in trouble because one of his recent Unpopular Opinions was “You should learn a text-based editor like Vim or Emacs.” And of course, the nerds came out of the woodwork and said “Emacs is not necessarily a text-based editor.” Sure, you can use it inside a terminal, but Emacs is so much more than just a text-based editor. Of course, there are GUIs for Vim. But yes, Vim in your terminal would be a TUI. Wouldn’t it, Nick?

Yeah, I would agree with that.

So yeah, I think Nick’s on point, and I think Adam’ on point. I think the point is statelessness versus statefulness.

Nic’s was more scientific though. He was like a scholar laying out there what TUIs are.

Just off the top of his head. He’s just scholarly.

Well, he was being very technical and pedantic, as we would expect us to be… And I think he’s right. I think the statefulness is the point. A command - or a utility, as you called it, Adam - from the command line is a single transaction, like Nick said. You run the command, it does some stuff, it outputs some stuff… Maybe it outputs nothing, as it should, if everything goes correctly, and it has no output. Whereas a TUI has state. You launch it, it goes through time… [laughs] Things change on it as it runs, and then you exit it. And so I think that’s pretty much the difference.

I would probably say they’re themeable as well. I mean, there’s an interface that you care about.

Themeable I think is a feature that you would want in a TUI, but not necessarily…

A desirable feature, I would say… For me, at least. I want a theme everything Dracula; if it’s not Dracula, just throw it in the trash.

Let me introduce you to a new text-based user interface for HTTP requests. This actually kind of inspired this episode, because I just thought this was so cool, “I want to talk about it more.” I put it in news on Monday. It’s called Posting. A powerful HTTP client that lives in your terminal. And it’s basically like take Postman or take Insomnia, put it in the terminal, it’s built with Textualize, so it’s a Python tool… You can pipx-install it like I did… And it’s very much like a Postman insofar as you have like collections, and you can create [unintelligible 01:08:30.01] different sessions of requests… So it’s not your typical just run curl, get an output. This thing is a long-standing application. The reason why I wanted to introduce it to you, Adam, is because this sucker is themeable. In fact, if you launch it, it’s beautiful to start. But you can also hit Ctrl+P for commands, and it has the command palette, which is so common in text editors and other tools today… And you can just go through the themes and change the way it looks. And there is a theme called Hacker, with the hacker green on black… Guys, this thing is awesome.

It’s chasing my heart here.

I’ve gotta say, I’m just glancing the readme file on GitHub now, and there’s quite a few screenshots with different themes… Yeah, this looks pretty slick.

It’s very high-quality, in my opinion. You’ve got different built-in panes for different sections, like the request, the response, a collection of different things… If you are familiar with Postman, at least the earlier versions of Postman - I haven’t used Postman for years, but that whole UI is very much akin to that, but here in your terminal. And what’s cool about it is you can do all the keyboard shortcuts, but you can also use your mouse and click through on different tabs… And so it’s aware of the mouse, but also keyboard-driven.

[01:09:54.07] I wonder - this could be a question probably for Will McGugan and for the author of this, whose name is Darren Burns… How much of this functionality that they’ve accomplished in this particular tool he’s getting for free from Textualize, and how much of it Darren has actually done? Because I would consider this a very rich text-based UI, as opposed to a lot of them where it’s just keyboard commands, or it doesn’t really have all of the things figured out. The tab situation is correct. You can tab through the different areas, as you would on a webform… And it just works in the way you’d expect it to. It’s very easy to manipulate… So I’m just highly impressed by this one in particular.

Very nice. Yeah, I may have to check this one out. It’s actually interesting, though - this could be maybe a hot take on TUIs in general… So I really don’t use too many of them; like, sure, if you want to classify Vim as a TUI, and FZF once in a while… But I know there’s TUIs - and maybe we’ll get into this in a little bit - for Git, and there’s one for Kubernetes as well, like k9s… It’s just, my use cases just don’t really go after using tools like that. Because usually, I just want to run a one-off command, get some output, move on.

Do you use GUIs?

Yes, for certain things, definitely. Like if I’m editing a spreadsheet, or something, I prefer that, a GUI.

Would you consider a TUI for that?

If you can find me a good spreadsheet viewer TUI, then I shall.

Hold on, let me go back to the Awesome TUIs repo and see if I can just search for the word spreadsheet, or Excel… Hmm… Scim, an ncurses spreadsheet program for the terminal. Can we get you to try that one out?

I’ll give it a shot.

Or Vizidata. Actually, Vizidata is awesome. Have you tried to Vizidata?

That is more of a visualization tool,s o it’s not going to be like a one-for-one replacement for Google Docs, or Excel, or with numbers.

Yeah, I would say that spreadsheet one’s an interesting use case, because some of that – at least the way I use them is like let’s say I’m exporting a Stripe CSV dump for whatever courses I sold over the month, and I want to calculate something… I may just like use my mouse to drag, I don’t know, like three weeks’ worth of rows or in there, and kind of just sum up a total based on what I have selected. And I kind of feel like in a TUI that’s gonna be hard to pull off. It would probably be pretty easy to sum a whole column, but what about just rows 6-15 and 30 through 50?

That’s why this particular tool is impressing me… And I want to go back and maybe visit more Textualize-based and maybe even some more Charm-based TUIs, because the manipulability of this is higher than I would expect out of a traditional terminal tool. The fact that I could probably – I could imagine something built with this, and maybe it doesn’t do this, but I could imagine you’d be able to click and drag inside your terminal to select cells, as you would inside your GUI. And if we get that far - I mean, you may never have to leave the terminal again, Nick. I mean, this machine might last you another decade.

That’s right. [laughter]

I hope so…

Another decade…

Break: [01:12:54.25]

I was thinking about this while we were going beyond the norm of a developer tool, so to speak, to maybe go one layer deeper on a developer tool. And I don’t know if this is sponsoring the show, but I saw PagerDuty mentioned in this list as you were digging into this list further, Jerod; so I was following you, and I saw PagerDuty. And I’m thinking like, okay, well, there is pagerduty-tui, a minimalistic terminal UI to manage triggered incidents. And so I’m thinking “Gosh, well, I don’t want to go to the Sentry dashboard. Can I just to TUI this thing in Sentry?” And there’s nothing in here for Sentry, but I’m thinking like particular dev tools that are Web UI, dashboard-based things, like Sentry or others might be - would it make sense to have a TUI? Because like hackers be hackers… Give me an interface that is just simplified. Not the extras, just the things that matter. Is there a room for a TUI in the world of like a Sentry, or maybe even – who do we use for analysis, again? Plausible?

Plausible.

Yeah, things like that. Could there be a TUI for Plausible, and Sentry, and obviously PagerDuty, or something like that…?

Absolutely.

I would welcome that personally, right?

I would.

Yeah, I think so. Especially with that type of data. It’s like, you don’t necessarily need to see the pie chart, but the numbers matter. And if the TUI output them in a way that was glanceable, then you get the same information. So yeah.

[01:18:07.23] Quick check, too. I don’t have to exit my terminal… I can maybe even have a tmux session with it already there.

Exactly.

It’s already in my world, see?

Now you’re thinking…

Sentry, you should do this.

I think Plausible should do it, too. I think that’s a great example of something that you normally would go to some sort of web interface to check. And there’s something powerful in the constraints that the terminal does put on a design, I believe, even though we’re starting to see more richness in tools like this one, where it might actually even be quicker –

…and just better information, architecture, and all that stuff. If you’re like “We have to provide a really simplified view for the terminal”, and then you just ask yourself questions like “Well, what really matters?” Versus like showing them all the widgets, you know? And so that could be really cool.

Yeah. Simplify the UIs is a big deal… And I’d imagine they can probably put a search or a query kind of like bar in that UI to interact with the data too, to some degree. Almost a command line for the TUI to change the data UI, or just maybe even buttons, or something like that that makes it a bit more rich.

The challenge, I think, is that - and maybe this is something we talked with – what was his name, at Google, first name?

Which one?

The fella that did Textualize, and Textual.

Will McGugan.

Will McGugan. McGoogle… I was thinking about a different friend of ours…

I thought you said “the fella from Google…”

I was thinking about McGoogle from that GitHub Universe trip we did. Remember that? That crazy –

Oh, yeah. Yeah.

Oh, man. That didn’t make it into your highlights video, man. I’m sorry about that. I didn’t take any pictures of that trip.

Probably not.

But that conversation we had with him I think was pretty interesting. I’m just wondering how much – we’ll link that up in the show notes, by the way; we had a great conversation with Will about Textualize, and Textual, and Rich… And really just this idea of where TUIs can go. And I think that was a precursor to a lot of this stuff; really just maybe a 101 on where this thing is going. But realistically, how defined is the interface standard, I suppose, for a TUI? They seem to be all over the map, and so maybe that’s why they’re less appreciated, maybe adopted, maybe developed, because there’s no kind of rich standard, like there is for iOS, for example. Or even like when you’re a web designer these days you usually begin with mobile screens first, or the smaller screens first, and that sort of sets the bar for your larger screens. And I’m just wondering, there is no true standard thus far… Or just a – what’s the right word for it? A system, a design system for these things. I almost feel like if you did that in UI components, maybe it might be – maybe that’s what Textual does, Rich does. I don’t know.

Yeah, it’s kind of moving a little bit away from the Unix philosophy, even though you’re still like right there, alongside all the Unix tools… Because instead of doing one thing, you’re doing lots of stuff. It’s stateful, there’s lots of features inside of a TUI, etc. and you’re kind of abandoning this idea of like inputs and outputs; everything is text. I’ve noticed a lot of these tools will have that some sort of alternate output mode, and it’s usually JSON… Which makes some sense, because JSON, for most tooling, is actually less work to parse than text is, in the case that you don’t know what the text is going to be until you start to use it. Of course, Nick probably can just sed and cut it to exactly what he wants, but that can be —

[unintelligible 01:21:40.00] to slice and dice this JSON…

I know, he’s actually – I can see his eyes moving. In his head he’s like sedding, he’s cutting stuff, he’s like “Oh, man, text is the bomb.” I don’t disagree with that. But I am noticing a motion towards more tools output in JSON, especially if they have a stateful UI, where the regular view is like this Rich client in your terminal, and then will also give you a JSON output. Not necessarily commenting on that, but I’m noticing it as a trend. And so that’s kind of going away from the Unix philosophy, right?

And then I think the standardization around inputs and outputs, everything is text, is - it’s not a user interface. It’s an interface. It’s a programmatic interface that has become a standard amongst Unix-like things, which now we have all of these rich things inside the terminal. I’m sure the Charm toolkit works differently than the Textualize one, it probably works differently than the Ratatui one… And so you may have to learn a UI every single time as you adopt these… Which can be a barrier to adoption. Nick, you were gonna say something…

Yeah, just a little bit. And it’s related to that as well. I’m sure you guys remember the old days with like Flash… And trying to build your own Flash application was a little bit challenging, because you kind of just had this white, blank screen, and then you could literally do anything. Whatever you wanted to put on there, within reason, can be done. But with HTML, you have some structure; you have like an h1, and your link tag, and some other stuff. So you have these little components to build something, which gives you a constraint, but it’s still flexible enough to build the things that you like. But yeah, it would be interesting to see if some of these more defined, I don’t know, terminal UI toolkits come out, or if they’re not already there… Like, if that would help spark a little bit more interest in building tools like this.

Well, that was the hope, going back to the conversation we had with Will, was he had a big idea, which - it would be fun to revisit that with him, Jerod… Because he had some - I would say even pushed back in the last 20 minutes on his philosophy, for being the founder and CEO of Textualize, which I believe is a company he founded and formed around this Textual, Textualize, Rich, all these projects around this idea of TUIs… And I think we were like “You just want to take these TUIs to make them websites…” It seemed like an oxymoron, like that doesn’t make sense really, counterintuitive to the idea… So I’d love to revisit that. But if we had a champion, like I think Will was trying to be, around standardizing what TUIs are, popularizing them, and then giving people the training wheels/frameworks/components, so that it’s a little easier to build them, I think would be a step up… Because I’m a user of them. And if there was more of services I use, like Sentry, or whatever else is out there, Plausible… I mean, where else could you use this stuff? Like, any place you would want to use a little dashboard, just get a version of it… You know, I know k8s has – wasn’t there a single pane of glass thing that Gerhard had back in the day when we were on Linode?

Yeah, k9s. There’s all that, for all these different applications. Docker has versions of them, I’m sure… Right, Nick? There’s all these things out there for Docker that you can see like “Okay, here’s all my containers running, here’s the CPU usage of each of them, and the status of it…” I mean, they’re here to stay. I wonder if we just had better tooling underneath. And maybe that’s what Will and team are doing for this. I don’t know.

Yeah, for sure. It’s actually another interesting segue, like - what’s the difference between a CLI tool that’s not a TUI, versus one that is? Docker is a great example. There’s a Docker stats command that you can run, and that will just list out all your running containers, and give you the outputs of like the CPU, memory, disk and network… Just little stats about those things. And there is this medium ground, I guess, between a CLI and a TUI for output. Have you guys ever used like the watch commands? And some commands just support –watch, Kubernetes as well. It’ll just watch a program and will let you know when the outputs are changing. So it’s like Docker Stats almost feels like it’s just doing that. It’s not quite a TUI, but yeah, there are other tools dedicated –

It’s a PUI, actually. It’s a plane UI.

Yeah. But going back to what Adam said before, around his definition of TUIs being more application-like, and going back to like the Unix philosophy… I do think, to some degree – like, when you’re using an application, there are certain characteristics of the Unix philosophy that you almost don’t care about. If you add a TUI to have like an mp3 player, it’s like you want to open that program, find the mp3 that you want, maybe there’s some bouncing lines over the EQ, or something; that’d be cool. Maybe some metadata about the file being played. That’s what I care about, because I’m using that application to select and play an mp3.

[01:26:21.15] But I guess technically… I mean, Adam - and Jerod, you mentioned this with like JSON output; do some of these TUIs also offer flags or ways to run them, to where if you wanted to get that metadata back, you can get that back in text form, and now it’s suddenly back to “Hey, I’m getting text as output. I can go and pipe that to something else.” So you kind of get the best of both worlds: the TUI when you want to use it as an app, and the outputs for when you want to do something else.

Yeah, absolutely. Obviously, it’s app by app… An mp3 player - like, what kind of output would you want from that, necessarily? Maybe like your list o recently played, or maybe… I did find a podcasting app which I threw in here, called Castero, which I downloaded and tried, and yes, it does work. This is a Python thing, so you pipx-install it… It doesn’t look like it’s necessarily maintained. It did work, I did listen to a little bit of Changelog News in there. That was pretty cool. And when you launch it - now, this is like a three-pane thing, with your feeds, your episodes… Something like that. And your – well, that’d be two panes. I don’t know. It’s like your podcasts, your episodes, and then what’s currently playing, or something. And my big gripe with that one is the Space bar, for some reason, doesn’t play/pause. It moves up and down. Anyways, that’s a small gripe, but…

It’s a good gripe [unintelligible 01:27:41.01]

[unintelligible 01:27:41.04] “What are you thinking, man? Come on, everywhere, the spacebar is a play/pause, or a quick look.” And so when you launch it, you’re like “I’ve gotta load my feeds into this thing.” And you can load in and out of, I think, OPML. And so I could see where Castero with some sort of flag, launching it - not the TUI, but some other version of the program - where it’ll just output your OPML, your subscriptions list as XML, or whatever it is. I could see that as an alternate way to run the program, and get some output that would make sense to pipe somewhere else. But yeah, it’s contextual. I think some of them makes total sense. A tool like [unintelligible 01:28:15.02] which its entire point is to do like HTTP requests and bring you back the information after running - I could see where you can put together a collection, maybe through using the user interface, set it all up, and a lot of people use these things for like integration tests… And you could maybe take that collection, save it as YAML, and then you could run it from the command line with some sort of alternate flag to where it’s not going to launch the user interface, it’s going to provide you a boolean, true or false, did it pass, or… You know what I’m saying.

I like the idea of the TUI/command line utility being symbiotic in the fact that you might hop into the TUI to do a more deeper visual application-like experience, that also has, like you had said, a configuration or setting. I’m thinking like even Tailscale; I’m wearing the T-shirt today. Big fan of Tailscale. Not sponsored… Where they can even have a TUI like that, where you’ve got multiple machines across your tail net kind of thing. You might go there and configure a collection of machines… I don’t know, do some cool stuff in the TUI. But at the same time you still have the traditional Tailscale CLI, or even in the same case here with [unintelligible 01:29:26.12] It’s like, the application is just one more way you enjoy the CLI, the command line interface that is there. It’s just a visual version of it built probably on top of it, with Textualize, or Textual, or Rich, or whatever they’re trying to use. I think more people should adopt these things, man… It’s just like an underserved market. I like it. Please do more of it. Please.

[01:29:51.27] Let me ask you one question here, Nick, on this Docker Stats, if you don’t mind… Because I have a question, because I did this on my Plexbox, which is an Ubuntu machine, in a VM, on Proxmox, so it’s got a single usage. Yes, I know I’m running Docker on top of a VM, on top of Proxmox, there’s multiple layers… It’s kind of unnecessary, but I like it, because it just keeps it siloed. But anyways, I digress. So when I type in “docker stats” on this Plexbox, which literally is only a single Ubuntu box dedicated to running Docker, to run a single Docker container, which is the Plex Docker container. Just to give you a full circumference of the reason for the machine. The CPU - I run Docker Stats, and it’s real time… The CPU is at 66 point whatever. But then - because I run tmux - I go into a new tab and I SSH back into that box again, and then I type htop, because that’s what I have on that box… And I see that my CPU is not being taxed at all at that percentage. What’s the deal? Why is Docker Stat seeing such a high CPU usage and it’s not?

Yeah. I mean, Docker Stats would be reporting the CPU usage of whatever’s happening in the container… But I mean, that’s still affecting your host operating system CPU. It’s not like a magic CPU that’s just going to exist. So that CPU load should have carried over. I mean, I’d have to look at your setup a little more in detail. I mean, when you run any Docker command, you’re connecting against wherever you have Docker running, right?

Well, I can tell you in Htop the average CPU usage right now is four point something… Whereas in the Docker stats, real time update, it says 64%. I was just wondering, maybe it’s a Docker thing. Maybe this image is allocated a certain percentage of the CPU, and of that slice that it’s been given there’s a high degree of usage being used. I wasn’t really sure. Anyways, that’s not what this show is about… I was just kind of curious.

That is a possibility, too. You’d have to look at the command that was run… Because there is a way to set CPU and memory limits on a container.

Okay. I’ll let you know more about that. Do you have a video about that?

Actually, no. So I’m gonna put that in my drafts.

Put in your drafts, man. And when you post it, tell me, and I’ll help you title it.

Yeah. I was gonna say, maybe I’ll put Adam in the title, so he finds it…

[laughs] I’m not searching for myself out there. “Help Adam with Docker.” And then all the results come back. There you go. What can we do to get more people to do these TUIs, Jerod? That’s what I want to know. Can we just keep doing podcasts about it every other year or so?

Yes. Just constantly.

That’s it?

Just do a watch, or sleep seven, or watch… I don’t know. How does watch work exactly, Nick, in terms of how often it runs? Does it run every second?

So I think it might be a second or two by default, but there is a flag to – you can set the interval. And then it’ll just like output new changes and let you know when it changed. There’s a little timestamp that happens.

Yeah. I’ve used it in the past, and I know Gerhard used it all the time… I think it’s a great way to basically build your own little stateful command. You’re taking a stateless command, and you’re just running it on repeat, which is lik, what is a user interface if not some sort of event loop with things updating at a frame rate? You’re basically doing that by using the watch command, which exists on every Unix-like system probably out there today.

Yeah. That demo he gave us was the bomb. Did that make it to YouTube yet?

It’s in the Drafts folder. It’s going to hit YouTube. This was our recent Kaizen, Nick. Gerhard demoed a pipe dream of mine, and he did a really good job. He actually had an entire scripted user interface… I mean, I actually don’t know how he put it together. It was a script, but it had a lot of –

It was magical.

  • head colors, it had state… I think it was just running different user prompts throughout, which we’ll put on YouTube. But I’m not sure how Gerhard did that. He probably used Dagger; that’d be my guess. If I know Gerhard, he probably used Dagger. Well, you were talking about watching Docker Stats… Have you seen this lazy Docker one? I know this was in the list…

It’s in my list. I did not try it yet, but it’s on my list to do.

[01:34:00.15] So there’s three tools built by Jesse Duffield. Lazy Docker, Lazy Git, and Lazy Npm. And they’re all of a similar ilk. Of course, sponsored by Warp, which is interesting. Warp is sponsoring Jesse’s work on these things; you can tell because there’s a big, special thanks to Warp in the readme. And it looks a lot like your Docker stats there, Nick, except for it’s interactive, you can select different images, and see more information… You can just watch the animated GIF there in the readme if you haven’t yet, to see what I’m talking about. Would that be something you’d be interested in using, or are you just good to go already? Because I know you’re kind of shying away from these things, but this one looks like it’s pretty useful.

I mean, I guess it would be “When would I use it?” What would be the use case that I would be like “Okay, now I’ve gotta use this.” Because I do know – for example, the other month I was doing a Kubernetes update, just updating from version… Whatever, 1.28 to 1.29. And that process when you have your own Kubernetes worker nodes requires like creating new nodes, and you need to join the cluster… And there’s a whole sequence of events that happen. And in that case - yeah, I just use Kubernetes’ watch flag on the nodes list, so I can see these new nodes coming up, when are they being drained, when are they ready, and stuff like that… So it’s like little one-offs like that. I don’t know, watch goes pretty far, but here… Yeah, I don’t know. I’d be curious, do either of you have a use case in mind where you would use this tool?

I don’t use Docker.

[laughs]

You took the easy way out.

He’s hardcore against Docker.

I just don’t like it very much.

I have one machine that I have more than one Docker container running on, and it’s the one machine that does home assistant, and other automation stuff… And it’s sort of like not in a good state, because I don’t have time to tinker with it… But I do have a single machine, that is a VM, that is intended to be more beefy, for multiple applications running in Docker. And I think in those cases, I would want something like that, because then you have maybe a Docker network, you’ve got multiple applications, you’ve got different things happening, at least on that machine… And it’s kind of like Htop, or Btop++, or Bashtop for Docker, essentially. You’re seeing your services, the containers that are running, the images they’re using, configs, stats… It’s kind of like that for Docker. Logs… I mean, I don’t know if I would dig into it, but I would certainly crack it open at least once or twice, just to see how cool it is to command this world. To have a single box for all these services.

Yeah. It is nice, because I mean, even like Docker Desktop is like the GUI version to look at some things about your containers and images and volumes and stuff. And it displays similar-ish things, but here’s like that same information on the command line. So it is nice.

Well, you need that for a headless machine. So in this case I’m SSH-ing into it. You need a TUI. And that’s actually a good example of where a TUI really applies, is like when you’re just SSH-ing into a box that has no monitor, or no GUI… You need a TUI. No GUI? Get a TUI.

And. And. Here’s the biggest pitch ever to use Lazy Docker… It looks like DHH is a sponsor. So his avatar’s on there on the readme file.

[laughs] Well, let me give you the actual pitch, because Jesse has taken a moment to write an elevator pitch… And I’m gonna read this to you, Nick, and you tell me if he sells you or not. He says “Minor rant incoming. Something’s not working? Maybe a service is down. Docker Compose PS. Yup, it’s that microservice, it’s still buggy. No issue. I’ll just restart it. Docker compose restart. Okay, now let’s try again. Oh, wait, the issue is still there. Docker compose ps. Right. So the service must have just stopped immediately after starting. I probably would have known if I was reading a log stream, but there’s a lot of clutter in there from other services. I could get the logs for just that one service with docker compose logs –follow microservice. But that dies every time the service dies, so I need to run that command every time I restart the service.

[01:38:03.03] I could alternatively run docker compose up my service, and in that terminal window, if the service is down, I could just up it again… But now I’ve got one service hogging a terminal window even after I no longer care about its logs.” It sounds like an infomercial. “It’s such a pain…!”

But wait, there’s more.

Yeah. “I guess when I want to reclaim the terminal real estate, I can do CTRL+P+Q… But wait, that’s not working, for some reason. Should I use Ctrl+C instead? I can’t remember if that closes the foreground process or it kills the actual service. What a headache!” This is an infomercial… He says “Memorizing Docker commands is hard. Memorizing aliases is slightly less hard. Keeping track of your containers across multiple terminal Windows is near impossible. What if you had all the information you needed in one terminal window, with every common command living one keypress away, and the ability to add custom commands as well? Lazy Docker’s goal is to make that dream a reality.”

It sounds like Jesse needs to start using tmux. Then his terminal problems go away. [laughter]

This is true. This is true.

No, but seriously, I will say, I tried not to read it along. I was just listening to you… And the way he handles some of those objections… What was it? The first one. To be like “Oh, I’ll just like follow that service.” Or “Maybe I’ll just up that one thing.” Like, those were things going in my mind, so I think he did a great job just demonstrating the usefulness of it.

Yeah. Like, you literally do those things… And it works for you. And he obviously knows how to do those things as well. It has a pretty good elevator pitch. But there’s something about knowing the pain of something enough that you just do it, and you kind of just become calloused to the pain… And you’re like “Well, that’s just what I do. I do the docker compose ps thing, and then I do that thing.” But yeah, tmux does solve a few of these problems.

I feel like you’re indirectly telling me to like upgrade my computer already, because all the pain I’m experiencing.

[laughs] Well, I told you that directly about an hour ago, so I wouldn’t need to be so coy.

Yeah. But if you had a production server, and we had a whole bunch of different containers running, like not in Kubernetes or something, and you just want to have an outlook of all of your Docker-related things… Yeah, I can definitely see that being useful. Because you’re right, it is annoying to be like up arrow, enter, Ctrl+C, switch the tab, do this thing… If I can just look at a screen and monitor to that stuff, that is a win. That is a quality of life improvement.

Right. Alright, so we’re selling it here, Adam. We’re getting them over to our side, the TUI world.

Slowly, but surely.

I’ve moved to about 10% now. At the start of the show I was at like two.

Resistance is futile. All will be assimilated.

By the way, earlier you mentioned that, Adam, you wanted to get a little bit more interest in folks contributing towards the TUI ecosystem of things… And I think you guys joked around about starting a podcast around that. But you guys do have Ship It, so I think you need to start like “TUI It.”

Hm… TUI It.

Well, that’s not our game, man.

[laughs]

I like your ideas, but that’s not our game.

What’s our game?

I don’t know, I would actually really encourage Will to do that kind of podcast. Because Jerod and I are not the epicenter of that. I think we would welcome him on the show, and encourage them to create their own content, because that’s their world, in my opinion… And I would support it from externally, and report to the masses, but not be the… Like, I suppose if I had TUI Inc, and I was trying to build the next big thing on top of TUIs, and there was some sort of advantage there, then I would… But our advantage is keep the main thing the main thing. And the main thing is not TUIs. The main thing is, I would suppose, developer culture, developer happiness, the latest tech that’s evolving, where trends are going, why should we care… Those kinds of questions. But I don’t discredit the idea, just not for us.

What would you name said podcast? I mean, obviously you said “TUI It”, but I think that’s a terrible name myself, no offense.

“TUI up.”

“TUI up”?

A little better.

Not “TUI Down…”

What about “TUI for You-i”? [laughs]

I bet you tui.fm is available… I mean, just to keep it super-short URL.

Yeah, that’d be cool. TUI.fm.

Or tuiftw.fm. That’d be a good company name, TUI for the Win.

Careful, Nick… If we land on a good name here, Adam’s gonna completely change from –

“Okay, we’re doing this…!”

…“Not our game” to “This is totally our game. We need to make this podcast.”

Oh, my gosh…

So we’ll stop there. Stop with a really bad name, like “TUI for You-i.”

Yeah. You’ve won the worst name possible.

Yeah, I did. I beat you on “TUI It.”

Well, I think TUIs are fun. I think I would summarize it – I don’t know how much more deep we want to go, but I think –

I think we’re plenty deep.

…there is a place for more TUIs out there. I do enjoy a good TUI. And if it was a sandwich or a meal of sorts, like a TUI sandwich… Nom, nom, nom. All day long. Give it to me.

Is this a Spanglish callback?

If it were a sandwich or some food, what would it actually taste like? How would you describe TUI as a taste?

Bright. Flavorful. Lots of flavor. Scrumptious. Yummy. Give me, give me, give me.

I’m not gonna wade into that pool. We’re gonna let that Adam have the final say on that. Alright, Nick, anything else you want to say about this or any topic before we let you go?

No, I think this was a really fun episode. I learned some new things. I may need to explore TUIs in a little bit more detail.

There is one thing I want to say before we go. Can I say one more thing? I think this is worth sharing this… Is the installation process - you can’t just get the TUI right. You have to get the install process right. And I don’t know how you all feel, but if the only way to install it via Npm, you’re doing it wrong. Can we do an unpopular opinion of that? That’s a popular opinion. I’m terrible at unpopular opinions.

I am so with you on that one. If I have to install Node to install your tool… And it’s nothing against Node. This could happen to Ruby, or whatever. It’s the same thing. I’d much prefer either – give me a binary I can just curl down and run it… Or if you have a built-in package manager support for my ls, that’s nice, too.

Yeah, I didn’t mind the process that I mentioned for Btop - or Bashtop, I should say. And that may have been dated, which was to do the add apt repository and the PPA version of it, and then literally update apt and then install the Bashtop application… I didn’t mind that. But don’t make me use a thing that’s not even intended to be on my system, that has no place on my system… Because it’s not my desktop. It’s maybe a remote machine or a standalone VM that I just don’t want to have – I want to keep it minimized. And if the only way to install is via only Node or Npm, then I don’t like that. I want to have a native way to install it from my system.

Yeah. I think a great point around that one too is just adoptability or adoptability of a tool at maybe like an organization. Because right now the place I work at, we’ve got 15 developers, and we’re allowed to have macOS, we can have native Linux, we can have Windows with WsL… These are all viable setups that you can have as your dev environment. And if I’m writing a script or a tool to help automate setting up tools on any of those devices, it is nice to have a way, like go to GitHub release pages for the project and just download that binary for that CPU architecture, that base operating system, and then that will just work. And there’s little variables, like you can run the command line to get those programmatically. So you have one command to run for any system that it’s going to be installed on; no external dependencies, or if conditions, or whatever. I think that goes a reasonably long ways.

Yeah. I’d definitely want to pay attention to the install process. I would say installation and initial usage to me is key for any TUI. It might seem obvious. Just simply type in Bashtop, for example, after you install it; that might seem obvious. But at least give me that next step in your docs where it’s installation for my system. I’m cool with brew, I’m cool with whatever else is out there… If you have an Ubuntu system, or you’re using Apt, give me that Apt flavor. If it’s a binary and you want me to pipe it into Bash, I’m cool with that, too.

[01:46:09.12] I’ll obviously check the file first before I do that, because hey, that’s just crazy… Or check the source code, and just double check that… But then after that, what’s the very first next step to enjoying the tool? What’s the config like? What’s the setup like? And I think for any TUI, that’s just how you document it, how you get people into it.

Yeah, I’m a big fan of just seeing the tool being used on something real, like a use case of “Here’s how to solve this type of problem.” I love that stuff. But even going back to the installation, Adam; would it help – let’s say that the tool is just a binary you can just install, but you need Node, or you need something… I think even if they wrapped it up in a Docker image, so you can just run it as a container quickly, at least to get a feel for the tool day one, I think that goes kind of a long ways.

That’d be kind of interesting, actually, to have a demo as a Docker image… Because you can set up like your own little dummy file system there if it required some demo data, basically. And provide a world where you’re like “Hey, let me try this out”, and I don’t have to like muck up my install, my machine; keep it vanilla, keep it pristine. Because even like on a VM, before I do some of this stuff, I will backup that VM if it’s necessary. You can’t back up a machine pretty easily, but you can do that with a VM on Proxmox, or a cloud box, or whatever. I like that, because you can easily – now, that assumes you’ve got Docker. But that’s a pretty good assumption of most developer machines these days, aside from Jerod’s. He’s just like “Don’t even touch my machine with D-O-C-K-E-R. Get it out of here.! No Docker here. It’s just too slow.”

I have Docker installed…

Oh, you do have it installed? Okay. Nevermind.

I just don’t want to. But I have to, because I’m a developer. And sometimes you just need it.

Some Docker 1, basically.

Yeah, they won. They won big time.

But I’m with you… If you had a Docker image, and it’s like “Hey, let me play with this”, that’d be kind of cool. I think it’d be good for mileage for new adoption, it’d probably be good for mileage for potentially even a dev setup to maybe more easily contribute… It can be a dual-facing use case for using Docker in that case, like a demo, as well as maybe contribution.

Yeah. Actually, I love that. That’s another angle. That’s really important. The more people that can contribute towards the project… Even just like opening up a PR to do some small patch… Yeah, if all you have to do is just run a container, and that’s it…

Absolutely.

Sign me up.

Yeah, I love that idea a lot, honestly. If I could just docker compose up anything, I’ll do it. You just send me a command. Anything whatsoever. I’ll just do it. I’ll tell you in this show, Jerod.

Just do it.

Just do it.

Send Adam a command. Anything. And he’ll just do it.

That’s right. That prefaces with docker compose, and I’ll do that.

[laughs] Alright. Well, Nick, always good to catch up. I think we should do more shows like these with you, because it’s always fun.

Yeah, thanks a lot for the invite. And if anybody’s curious, we mentioned I had two and a half gigs of hard drive space at the start of this episode. I’ve been recording this locally, just as a backup, if needed. It still shows that I have nine hours remaining of disk space. So even though a wav is being output, we’re still pretty efficient.

Wow. Wow. Even on that old hardware. You’re doing good.

We can keep going then.

We’re just nine hours away from denial of servicing them.

That’s right. That’s right.

[laughs] That’s a slow motion DoS. No, go ahead.

But I was gonna say - yeah, thanks again for the invite, and happy to come on whenever you want.

Awesome.

Well, you’re a friend. You’re welcome here anytime.

That’s right.

Bye, friends.

Alright. Bye, friends.

Outro: [01:49:38.14]

Actually, this a quick closing remark that’s maybe interesting, around good stuff for free. So when I was actually traveling around Portugal, I was on the top of some castle, I think it was St. George’s castle. I’m probably butchering the pronunciation… But I was wearing the Changelog shirt that you guys sent me the very first time I was on the show. And that is one of my favorite shirts, honestly. I wear it kind of frequently… And this guy was just like “Cool shirt.” And I was like “Thank you.” And he’s like “I’m familiar with the show. I’ve watched so many different episodes.” He knows who both of you are, and…

Get outta here…

Ain’t that weird?

No, it was really cool.

On a castle in Portugal?

That’s a small world, I guess…

But it made me think… The only reason I accepted your invite to go on the show was to potentially get another awesome, high-quality free shirt… [laughter]

The only reason… Well, now you’re not getting one.

Yeah, now [unintelligible 01:51:56.05]

We’re gonna set the flag to no coupon code.

To not send them the coupon code, yeah.

That’s right.

Just to spite you.

You can adjust the price so it’s actually twice expensive, so I can’t get it.

The function is called “has one or not”, and you already have one, so you get not.

No the toggle is like “Has he spited us?” And you’ve just spited us, so…

Oh, man…

[laughs] Ultimate backfires…

But seriously, do you guys have a different inventory of shirts? Or is it the same?

Well, it depends on which one you got. Do you have the OG?

I don’t know if it’s OG, but it has the globe and it says Changelog.

Same one, yeah. We haven’t changed –

Same one. But you can get a JS Party, maybe… Or you can get yourself a Kaizen shirt…

Or a Tailscale T-shirt…

We don’t sell Tailscale’s –

I’m just kidding. That’s what I’m wearing.

Adam will send you the Tailscale off his back. Yeah, so you could get a Practical AI – so you don’t have to get the Changelog one, so you’d have two. You can get a different version. You can get a Kaizen…

There’s a few more Kaizens out there.

Watever you like, man. Hook yourself up.

You have to have the special link to get the Kaizen.

Cool. I was trying to give you guys a free plug on your awesome shirts.

No, I loved it. And we’re just messing with you.

Yeah, that’s so cool, though. Honestly, to rewind, you can 100% have another T-shirt.

Changelog

Our transcripts are open source on GitHub. Improvements are welcome. 💚

Player art
  0:00 / 0:00