An Era in Middle Earth
Ep. 34

An Era in Middle Earth

•

Episode description

Large language models and command-line coding agents can expand programming horizons, and Bazzite Linux puts the fun back into playing video games on PCs.


đź”— Links

Download transcript (.vtt)
0:00

[DJ]: I found something great on the internet the other day, Justin, and this is the part of the show where we share such things.

0:06

[DJ]: So I want to tell everybody about the art of interacting incorrectly.

0:12

[DJ]: I can't believe I said that right the first time.

0:16

[DJ]: This is a thing that's at interactingincorrectly.online, and this is basically an online art installation.

0:25

[DJ]: So it's by an artist named Isabel Fish, who created a dozen animated horses using unconventional methods with her computer.

0:34

[DJ]: And I came across this from a great person to follow online, Gina Trapani, who has a website at notetoself.studio.

0:43

[DJ]: And I'm actually going to describe what you will see at The Art of Interacting Incorrectly a little bit less than she does, because I really want people to have the joy of going to this really strange web site and clicking on stuff and finding out what happens.

0:59

[DJ]: This is like other things that we've shared previously in pre-shows.

1:05

[DJ]: Just one of those things that makes me so happy the web exists.

1:08

[DJ]: Because again, like this thing really isn't a blog.

1:12

[DJ]: It isn't another type of web site, online store.

1:15

[DJ]: Like this really is like an art installation.

1:19

[DJ]: And I just think it's magical.

1:20

[DJ]: So check it out.

1:22

[JM]: One of the most beautiful things about the Internet is being able to see what people create.

1:27

[JM]: I think of all the things that humankind has created over the millennia that most people never got to see.

1:33

[JM]: And this is a classic example of something that someone put in an inordinate amount of time,

1:40

[JM]: and it is fun, it's quirky, it's really creative and something that in the past people would just never have an opportunity to enjoy and brighten their day.

1:52

[JM]: And it's great that we live in an era in which we can enjoy these things that people far more creative than I am can build and share...

2:03

[JM]: and make my day brighter.

2:04

[JM]: So I send my thanks to whoever this person is who made this incredible thing.

2:11

[JM]: This reminds me of a great Oscar Wilde quote, and I'm going to read it along with the gendered

2:18

[JM]: portion of the quote, which is regrettable, but you know, I guess whatever, this was the way people talked back then.

2:24

[JM]: "We can forgive a man for making a useful thing as long as he does not admire it.

2:29

[JM]: The only excuse for making a useless thing is that one admires it intensely. All art is quite useless."

2:37

[JM]: And I think that sums up this particular project, right? Like it is useless. Like, there's no point to it. Doesn't solve a problem, it's not something that you're going to look at and be like, "Wow it's so pretty. I feel so moved and emotional by the beauty of this creation." No, it's just fun and silly and creative and useless, and that's what makes it amazing.

3:01

[JM]: Okay, moving on.

3:02

[JM]: A couple of weeks ago, I was in an online chat and my friend Jeff Triplett introduced a couple of us to his workflow for using large language models to write code.

3:15

[JM]: And as we have talked about on this show, I have dabbled with large language models, both in a browser and running locally...

3:23

[JM]: but never really to write code.

3:26

[JM]: My purpose up until now has just been to try to understand what these models are capable of in terms of answering questions, solving problems, and other experiments for me to just to understand what they can do.

3:38

[JM]: But I've long wanted to better understand how to use these tools to either solve tricky code-related problems or to allow me to be more ambitious or expansive in terms of the types of things I'm willing to spend my time on, because of the potential for these things to make certain tasks easier.

3:59

[JM]: So I was really excited to see Jeff demonstrate a bit of his flow, and Jeff demonstrated using Claude Code in conjunction with MacWhisper in which he would push a button, not on his normal keyboard, but he has a little four key separate mechanical keyboard.

4:22

[JM]: It's got, again, four keys on it so that he can

4:26

[JM]: not have to have access to the full keyboard.

4:28

[JM]: He talked about using a treadmill desk, if I remember correctly, and wanted to have something he could easily use while he's on the treadmill.

4:37

[JM]: And so he can push a button on his four-key keyboard to invoke MacWhisper, which is a dictation tool, to then speak his prompts into Claude Code.

4:47

[JM]: And he gave

4:48

[JM]: Claude full permissions to just go ahead and do things in a potentially unsafe manner, because he is doing this in projects where he can always revert if it does something weird.

5:01

[JM]: And so he demonstrated how he would push a button, speak his prompt, send it, and then Claude Code would furiously start iterating and introspecting and writing code and running into problems and fixing its own problems.

5:15

[JM]: It was really fascinating to watch.

5:16

[JM]: I'd never really understood up until that point...

5:18

[JM]: that one of the primary benefits of these CLI agentic coding tools that you run in a terminal console is that you don't have to manually specify the context.

5:31

[JM]: You don't have to say, "Okay, here's the files I want you to look at."

5:35

[JM]: It just looks at whatever your current working directory is when you invoke it.

5:40

[JM]: And that becomes the parent directory that becomes the place from which it does its introspection.

5:46

[JM]: And oftentimes, if it's the first time you're running these tools in a project, you can run a command like /init, and it will start to write out in either an AGENTS file or a CLAUDE file.

6:00

[JM]: That's a Markdown file that essentially collects what it has determined are the salient details about the project so that it can refer to those again in the future.

6:11

[JM]: So it was really cool to see someone use these tools in a way that solved useful problems.

6:18

[JM]: And I felt inspired, so the very next day I thought, okay, before I start messing around with Claude Code, which I've never used before,

6:26

[JM]: I thought, in typical fashion, I want to try to use an open-source tool first.

6:32

[JM]: And so I initially experimented with a tool called OpenCode.

6:37

[JM]: And OpenCode is clearly modeled after Claude Code, like even down to the aesthetics in the terminal console.

6:44

[JM]: Like it looks very similar in terms of, I don't know, color schemes, or just the way it's laid out.

6:50

[JM]: And the installation of OpenCode was super easy.

6:54

[JM]: Getting up and running with it was painless.

6:56

[JM]: Connecting it to a local large language model running on a workstation was a little bit more complicated, but figured it out without too much trouble.

7:06

[JM]: Because you can use tools like this really with either remote APIs like Claude or ChatGPT, Gemini, etc.

7:16

[JM]: Or you can connect them to local models running on your machine.

7:19

[JM]: So in this case, I connected it to Gwen3 Coder, which is a 30 billion parameter model...

7:27

[JM]: and tried to think of an initial test, like what should I have it do?

7:33

[JM]: And I thought, okay, well, I have this Pelican web site that was originally created using Tailwind CSS version 3 and Tailwind CSS version 4 is now out and they have a migration tool, and

7:47

[JM]: spoiler alert, the migration tool isn't very good and did not successfully migrate the version 3 project to version 4.

7:56

[JM]: And so I thought, okay, well, maybe this is a good test case for this thing that I'm trying to experiment with.

8:02

[JM]: And so I ran OpenCode with this Gwen3 Coder model.

8:07

[JM]: And it iterated a few times.

8:09

[JM]: I kept telling it, yeah, this still isn't right.

8:13

[JM]: It's not correct.

8:14

[JM]: And eventually I thought, okay, well, I've given this tool a spin.

8:17

[JM]: Let's try another open-source tool called OpenHands.

8:21

[JM]: OpenHands has a CLI version and it also has a web-based version.

8:28

[JM]: I didn't fully understand that at first.

8:30

[JM]: And so I installed the web-based version via Docker.

8:34

[JM]: And compared to OpenCode, it felt a little, I don't think over-engineered is quite fair, but it just felt bigger.

8:40

[JM]: Maybe the fact that it was using Docker to begin with made it feel that way to me.

8:46

[JM]: But regardless, after a bit, I realized that it had a CLI version, tried that instead, and it was similar to OpenCode, pretty easy to get up and running.

8:55

[JM]: But it similarly failed to achieve the task at hand.

9:00

[JM]: It also iterated a few times, and I eventually just gave up trying to get it to successfully convert this Tailwind CSS project from version 3 to version 3.

9:09

[JM]: So I thought, okay, I've spent a

9:11

[JM]: decent amount of time trying to use open-source tools with open-weights models.

9:15

[JM]: And I really wanted it to work out.

9:18

[JM]: But for the moment, it's not working out. It's time to try what it seems like lots of other people are using.

9:24

[JM]: And so I installed a Claude Code, which requires, if you're using the CLI version, a subscription, and I'm happy to give them $20 a month if

9:34

[JM]: it ends up saving me even a modicum of time.

9:38

[JM]: And in this case, it saved me a lot of time because in the end, it very quickly made changes to this project and successfully moved it from version 3 to version 4 of Tailwind CSS.

9:50

[JM]: And I was very impressed to see how handily it solved this tricky problem that these other tools could not solve.

9:59

[JM]: And so then the challenge for me becomes, how do I remind myself that every time I'm bumping into a problem to not just do what I would normally do, which is either do a bunch of web searches,

10:13

[JM]: and if I don't easily find a solution, just shelve it and probably never come back to it.

10:20

[JM]: And instead be like, okay, no, this is actually where these tools can be useful.

10:25

[JM]: So one thing I realized the other day is that I sometimes download lossless audio files, music in FLAC format.

10:35

[JM]: And sometimes these files come as 24 bit, 96 kilohertz files.

10:42

[DJ]: That seems like a lot of kilohertz, Justin.

10:45

[JM]: It's a lot of everything.

10:46

[JM]: I think that there are people who just drink the high-fidelity Kool-Aid so much that anything bigger is better.

10:57

[DJ]: And you're suggesting that you are not one of those people?

11:00

[DJ]: I am not one of those people.

11:02

[DJ]: Show me your speaker cables right now.

11:04

[DJ]: I bet they're gold-plated.

11:06

[JM]: I have friends who in turn have friends who will spend four digits, like actual thousands of dollars on cables, like a single cable.

11:19

[DJ]: What?

11:20

[JM]: They'll spend $25,000 on an amplifier.

11:24

[JM]: These people can hear things, I guess, that I cannot hear.

11:27

[JM]: So I feel very confident that I cannot hear the difference between 24 bit audio and 16 bit audio and similarly that I can't hear the difference between 44 kilohertz audio and 96 kilohertz audio.

11:42

[JM]: So to me, all of this is just a bunch of wasted disk space.

11:47

[JM]: I have plenty of disk space, and therefore it's not a big deal either way.

11:51

[JM]: It's just the idea of it.

11:53

[JM]: It's just that it's going to take up two or four times as much disk space than I need it to.

11:59

[JM]: And that just feels wasteful.

12:01

[JM]: So when I get these files that I want to downsample,

12:05

[JM]: I will push the up arrow in my terminal, I will find a simple one-liner for-loop that I've used countless times that says "for file in this folder of FLAC files, run this FFmpeg command to down-sample this to the format that I want".

12:24

[JM]: But every time I do it, I go up and I change the paths because of course the input path, the folder of files I want to convert, is different every time because I'm downloading different folders of music.

12:35

[JM]: And after doing this for the hundredth time, I thought, okay, this is stupid.

12:38

[JM]: Like, of course I have thought before that I should just turn this into a shell script, but it's never really been worth my time to do it.

12:46

[JM]: And I thought this is perfect.

12:48

[JM]: So I came up with a relatively simple prompt and said, here's my-one liner, I want you to write a shell script, in this case, in Fish shell, because that is my preferred shell, to do the same thing with two parameters: input path and output path.

13:03

[JM]: And I want you to add some error checking to make sure that the paths exist, or if the output path does exist, don't overwrite it.

13:11

[JM]: And if it doesn't, create it.

13:13

[JM]: And some other miscellaneous things that I thought I should incorporate.

13:17

[JM]: And moments later, Claude Code had spit out a

13:21

[JM]: perfectly cromulent Fish shell script that I now use to convert folders of FLAC files without having to do this monkeying that I used to have to do in terms of changing the path manually.

13:34

[JM]: So with these two wins under my belt, I decided to get more ambitious.

13:38

[JM]: The open-source software that we use to publish this podcast has support for a newer standard for chapters. Because I like having chapters in podcasts, both as someone who listens to them,

13:51

[JM]: and as someone who is providing them to other people. I want people to be able to easily move from one chapter to another.

13:58

[JM]: I want people to be able to see a list of those chapters.

14:01

[JM]: But as it stands now, I have to manually generate this newer JSON-based chapter file because that is the format that our podcast software expects.

14:13

[JM]: Whereas when I author our podcast, I put the chapters into the audio file itself in the form of ID3 tags, which is a standard that's been around for a while.

14:25

[JM]: And it's been the way that all podcasts have added chapters until the point where someone decided to add this other way of doing it as an external JSON file.

14:35

[JM]: So the way it works now is I author the file and then I have to go through the somewhat cumbersome process of generating the JSON file to then add it to our podcast.

14:47

[JM]: So I thought I would use a large language model to instead add support natively for recognizing

14:55

[JM]: the ID3 chapters in the audio file and generate the JSON file automatically without me having to do this somewhat cumbersome manual step in between.

15:05

[JM]: And the short version is that after churning away for a couple hours, going back and forth, me saying make sure that existing tests pass, make sure you write new tests, and also run this particular

15:21

[JM]: command to make sure that it works properly.

15:24

[JM]: Oh, and then I think my favorite part of the process as we got towards the end of it was when Claude tells me, "Try adding a new episode and then check the logs and then copy and paste the logs here so that I can fix any problems that occur." Something along those lines.

15:43

[JM]: And I thought, when I started this session, I told you to bootstrap the development environment.

15:48

[JM]: Which, by the way, amazing.

15:50

[JM]: Handled it with aplomb.

15:51

[JM]: I said, "I don't know anything about this PHP project.

15:54

[JM]: Set up, just bootstrap the development environment so that I can load it in a browser."

16:01

[JM]: And it totally worked.

16:03

[JM]: It was really, really impressive.

16:05

[JM]: There was one problem where I couldn't load it in the browser.

16:08

[JM]: And then I explained what I was...

16:10

[JM]: experiencing.

16:11

[JM]: And it said, "Oh, it's because there's an issue in the Docker Compose file that the project ships with that makes it so that if you're running the project in Docker, it's not being exposed to the browser running on the workstation."

16:25

[JM]: And long story short, it fixed that.

16:27

[JM]: It was great.

16:28

[JM]: But going back to what I said before about it asking me to add an episode and then copy and paste the logs, I thought, "You're the one that bootstrapped this environment.

16:37

[JM]: You do that.

16:40

[JM]: You should be trying to add an episode and then monitoring the logs so that when it fails, you can see why and then you can fix it.

16:49

[JM]: Take me out of the loop.

16:50

[JM]: Isn't that the point of this tool?"

16:51

[JM]: So when I pointed that out, it was like, "Oh, okay, got it."

16:55

[JM]: "I'll do that."

16:55

[JM]: And then it started doing that.

16:57

[JM]: At some point, I realized this was just consuming too much time.

17:00

[JM]: And I decided to take a break.

17:04

[JM]: I'm sure with time, I would eventually got there.

17:07

[JM]: And it reminds me of something I knew before I even started this whole adventure, which is that there is a set of skills when it comes to using these tools.

17:16

[JM]: And as it stands right now, I don't have any of those skills.

17:19

[JM]: This is my first go-round with these things.

17:22

[JM]: And there's a whole bunch of learning to do.

17:25

[JM]: I have seen and bookmarked a whole bunch of articles that talk about these are the things you should keep in mind when using these tools.

17:32

[JM]: And these are the things that you

17:34

[JM]: should do in order to get the most out of them.

17:37

[JM]: And with time, I'm sure I will dig through those and learn about them and be able to better tackle meatier tasks like this particular one that I was trying to do.

17:49

[JM]: It occurred to me while I was doing this is, oh, finally a great use for using an iPad as an external display because I have this iPad Pro and I really don't use it very much in this way.

18:04

[JM]: I know that I can, and it's not that I don't see the value in having an external display, but my Apple Studio display gives me plenty of screen real estate and I usually just don't need it.

18:14

[JM]: But this I thought actually is a great use case for it.

18:17

[JM]: And the reason is,

18:18

[JM]: unlike Jeff, I wasn't running this in unlimited permissions mode,

18:23

[JM]: you are free to do whatever you want.

18:25

[JM]: So I am constantly saying like, yes, you can proceed.

18:27

[JM]: Yes, you can proceed.

18:29

[JM]: I'm giving it this approval, but there's times where it needs to churn through something for a while before it gets to that.

18:34

[JM]: And so it doesn't make sense to just sit there and be staring at it and babysitting it.

18:38

[JM]: So I'm going to do something else.

18:40

[JM]: But then I don't know once it's arrived at a point where it's asking me for permission.

18:44

[JM]: And so I have to constantly flip back and forth.

18:47

[JM]: And sometimes, of course, I get distracted with what I'm doing,

18:49

[JM]: and I forget to go back to it.

18:52

[JM]: Well, here's a great example of using it as an external display because it can just go and go and go.

18:57

[JM]: And as soon as it stops, I notice the fact that it has stopped because it's in my field of vision.

19:02

[JM]: And so I thought that was interesting as a use case for iPad as an external display is to use it for agentic code tools.

19:09

[DJ]: So that's where you you put the terminal running the tool on the iPad using the iPad's ability to extend your Mac's screen essentially. Cool. I have a question before we go on, about the open source versions of these things that you tried, like OpenCode and OpenHands. do you think the lack of success that you had

19:31

[DJ]: was down to the open-weights model you were using or the tool or both.

19:38

[DJ]: In other words, if you had taken OpenCode and pointed it at Claude, do you think it would have done a better job?

19:46

[DJ]: I'm wondering if the open-source programs for this aren't there or if it is merely the difference between the open weight models and the so-called frontier models.

19:56

[JM]: I asked myself that very question when doing this experimentation.

20:00

[JM]: And my guess is that it comes down to the model itself.

20:04

[JM]: Because these tools are really just thin wrappers around the model itself.

20:10

[JM]: I think Simon Willison defined LLM agents as running an LLM that has access to tools in a loop.

20:20

[JM]: So to that extent, these tools aren't doing very much other than running in a loop.

20:26

[JM]: So I don't think the issue so much as with the tool as much as the model, but I have not given up on the concept of using local models for writing code.

20:39

[JM]: And I'm going to continue and have been continuing since this initial experiment to look for models that might be a better fit for the task at hand.

20:50

[JM]: And also, there's the possibility that I'm not using the local models correctly.

20:55

[JM]: Perhaps there are temperature settings that I need to adjust.

20:59

[JM]: I don't really understand some of the fine tuning that goes into using these local models.

21:06

[JM]: And just because they didn't solve these particular problems that I was trying to use them to solve doesn't mean that I'm going to give up on the concept and going to keep experimenting with them.

21:15

[JM]: One of the other things that Jeff demonstrated, and this is a tool that is on his excellent list of Default Apps 2025, which is a list of the apps that he reaches for, for a particular category.

21:31

[JM]: And right at the top in the AI category is Claude Code and a couple of other models that he uses.

21:38

[JM]: And also in this list is a tool that he demonstrated called VibeTunnel.

21:42

[JM]: And I've seen this class of tool before, where it exposes a local service running on your workstation so that you can access it outside of your normal environment.

21:54

[JM]: Because of how most networks are set up, including network address translation, it's not easy to access something that's running on your local workstation, say at home or at the office from another location.

22:07

[JM]: So there are tools like Ngrok and others that will allow you to more easily access from another place.

22:14

[JM]: What makes VibeTunnel a little different is that it allows you to do it in a browser context.

22:20

[JM]: So in this particular example, I ran `vt` for VibeTunnel, `vt open code` in the terminal,

22:28

[JM]: and I have my Mac, phone, iPad, and other devices all connected to each other using Tailscale, which is a way of networking that makes it easier to bypass a lot of these aforementioned networking hassles.

22:43

[JM]: And this was really useful for me when running Claude Code the other day, because when I was churning through this podcast chapter implementation I was trying to do, I ran into the limits of my $20/month Claude plan.

22:58

[JM]: Because at some point it will essentially say like, you've used enough tokens in this allotted time period that we're going to throttle you and not really throttle you.

23:09

[JM]: You need to come back in a couple hours.

23:11

[JM]: It told me like at say 11 a.m. that I could come back to it at 1 p.m.

23:18

[JM]: So I thought, well, no problem.

23:20

[JM]: I ran this via `vt claude code` in the first place.

23:24

[JM]: So I went out to lunch and a couple hours later, I'm still away from my office, and I pulled up on my phone the browser session containing

23:36

[JM]: VibeTunnel and tapped on the only session that was in there, because you could have multiple sessions.

23:41

[JM]: In my case, I only had one running, and that was this existing Claude Code session.

23:46

[JM]: And so I tapped on it and I was able to continue from where I was, instead of having to wait until I got back home.

23:52

[JM]: And this could be even more useful in a world in which I'm able to get some of these large language models running locally on my workstation to function really well.

24:02

[JM]: Because then if I'm on a computer, even elsewhere in the same environment, even if I'm not outside my network, but if I'm just, say, on a different floor of my house, but the

24:13

[JM]: powerful M3 Ultra Mac Studio is running the large language model but I'm on a much less powerful machine elsewhere in the house, I can then access that very easily in a way in which would be more cumbersome to do otherwise. So if you ever are running things in a terminal that you want to be able to access somewhere else, VibeTunnel is really cool, and I highly recommend checking it out.

24:35

[JM]: All right, moving on.

24:37

[JM]: Dan, as I think you know, there are PC gamers and there are console gamers.

24:42

[DJ]: I have heard this, yeah.

24:44

[JM]: I am a PC gamer.

24:46

[JM]: I have not owned a console since I think the Nintendo SES days.

24:52

[DJ]: SES, what is that?

24:54

[JM]: Super Entertainment System.

24:56

[DJ]: No, you mean the Super NES?

24:57

[DJ]: The SNES?

25:00

[JM]: Yeah.

25:00

[DJ]: Like the 16-bit one?

25:02

[JM]: The one that came with Super Mario Bros.

25:05

[DJ]: Yeah, that's the Super NES.

25:06

[DJ]: It's not the Nintendo SES.

25:08

[DJ]: So this is how long, yeah.

25:10

[JM]: Yeah, it's been that long.

25:12

[DJ]: You haven't...

25:14

[DJ]: It's like an era in Middle Earth since you owned a video game console.

25:20

[DJ]: You're like Galadriel.

25:21

[DJ]: Who was known to be a big console gamer in the second era, but in the third age, I can't remember if they're eras or ages in Middle Earth, but anyway, then she switched to PC gaming.

25:31

[DJ]: It's well known, if you read the Silmarillion.

25:34

[DJ]: Anyway, where were you going with this topic, Justin?

25:37

[JM]: Well, the unfortunate part of being a PC gamer is that that means, by and large, running Windows.

25:44

[JM]: Games are the only reason I have ever willingly used Windows.

25:49

[JM]: And here I am using the word "willingly" very charitably.

25:53

[DJ]: And when you say "willingly", you mean "unwillingly".

25:56

[DJ]: But you had to.

25:57

[DJ]: You *had* to use Windows.

25:59

[JM]: I don't really know that there's another way, at least traditionally, to be a PC gamer aside from running Windows.

26:06

[JM]: And so over many years, I have built one gaming rig after another.

26:12

[DJ]: And then soiled them by installing Windows there.

26:16

[JM]: And then ruin them by installing Windows, which again was more or less required in order to do what I was trying to do.

26:24

[JM]: But I would buy the best video card that I thought was reasonable for the type of games that I wanted to play.

26:30

[JM]: And the most recent iteration of this was seven years ago when I built a gaming rig with a

26:37

[JM]: small mini-ITX motherboard and enclosure, which means that it is portable.

26:43

[JM]: If I want to, for example, I can easily disconnect it from the monitor, say in my office, take it downstairs and reconnect it to my TV in the living room.

26:53

[JM]: In this particular build, I used an Nvidia RTX 2070, which means that it can play the kinds of games that I care about in 4K.

27:04

[JM]: I don't need to run today's most demanding games in high resolution.

27:13

[JM]: Yeah, that's just not something that I need to do.

27:16

[JM]: So this seven-year-old build works just fine for what I'm trying to use it for.

27:22

[JM]: But the problem is that again, it runs Windows.

27:25

[JM]: So a typical session in the past, because it isn't something that I do very often -- I don't play lots of games.

27:32

[JM]: And so every once in a while I would fire it up,

27:34

[JM]: and the first thing it would do is download a mountain of Windows updates.

27:38

[JM]: Aside from the time that it takes for those updates to install,

27:41

[JM]: it would sometimes pull in a new Nvidia driver update that would result in an instant black screen that I could not easily recover from.

27:52

[DJ]: Yikes.

27:53

[JM]: And I reinstalled Windows onto this box multiple times.

27:57

[JM]: So typically when I would turn on this computer to play a game, I spend more time futzing with it than actually playing games.

28:04

[JM]: And this is where every console gamer just nods their head and says, "That's right."

28:08

[JM]: "Yeah."

28:09

[JM]: "Why do you think I'm a console gamer?"

28:11

[JM]: "I learned that lesson a long time ago."

28:12

[JM]: "Why are you still a PC gamer?"

28:14

[DJ]: Yeah.

28:14

[DJ]: I mean, modern consoles are notorious for downloading 17 gigabytes of updates before they let you play a game every time you turn them on, too.

28:22

[DJ]: But, but yeah, once upon a time it was a lot simpler.

28:25

[JM]: And that's fair, but I think downloading a video driver that essentially bricks your machine is not something that console gamers typically have to encounter.

28:35

[DJ]: No, that's true.

28:36

[JM]: Yeah, so the short version is Windows sucks, and the end result is that I don't play video games.

28:43

[JM]: This computer has spent most of its life collecting dust on a shelf.

28:47

[JM]: But I've had this item on my to-do list for a while, which is to experiment with playing games on Linux.

28:55

[DJ]: Linux? Are you mad?

28:57

[JM]: Well, I kept coming across articles that talked about playing Windows games on Linux, meaning you're not playing native Linux games on Linux.

29:09

[JM]: You're playing the actual Windows game using emulation layers like WINE to translate the API calls.

29:19

[JM]: I don't know actually how these things work.

29:21

[JM]: The bottom line is you can go to protondb.com, if I remember correctly.

29:27

[JM]: Proton is based on WINE, and Proton makes it easy -- or easier -- to play Windows games on Linux.

29:36

[JM]: And I think the thing that finally pushed me to doing this was I kept seeing people say, "For the most part, I find that games run better in Linux than they do on Windows," which sounds bananas.

29:49

[JM]: You're telling me that a Windows game

29:51

[JM]: running on Linux -- not something that's been ported to Linux, but a Windows game running on Linux -- runs better than it runs on Windows.

29:58

[JM]: Like, that doesn't sound possible.

30:00

[JM]: And yet I kept seeing this enough that I thought, I'm not using this thing anyway, because of aforementioned Windows shenanigans.

30:08

[JM]: Oh, and by the way, last month,

30:10

[JM]: Microsoft terminated support for Windows 10, which is the version that I have running on this box.

30:16

[JM]: So I had to do something anyway, in order to use it for really any purpose.

30:22

[JM]: I wasn't super interested in upgrading to Windows 11...

30:26

[JM]: for a variety of reasons, including them making it harder to use Windows without creating an account or logging in with an account, which to me is just silly.

30:35

[JM]: All I want to do is play a game on this thing.

30:37

[JM]: Why am I signing in to a Microsoft account to play a game?

30:40

[JM]: This is silly.

30:41

[JM]: I'm not interested.

30:42

[DJ]: Well, now that's not really fair, because by being signed into your Microsoft account, when you save the save games from the video games you're playing to your OneDrive, you'll eventually run out of free OneDrive space, and then your operating system will start bothering you to pay them more money so that you can continue syncing your games with OneDrive.

31:02

[DJ]: So, I mean, I'm surprised that you didn't upgrade for that alone, because it's...

31:08

[DJ]: Doesn't piss me off every time I turn my gaming PC on, that's for sure.

31:13

[JM]: No, clearly you're totally happy with this state of affairs.

31:18

[JM]: Oh yeah.

31:18

[JM]: There are a lot of different ways that you can play games on Linux, but the tool that I kept seeing over and over again, including a mention by the aforementioned Jeff Triplett, who also has experimented with this, is called Bazzite.

31:34

[JM]: And Bazlite is a Linux distro that is based on Fedora that is focused on games.

31:40

[JM]: It has built-in support for Steam and a handful of other game platforms.

31:46

[JM]: So if you have already bought games on these platforms, it's easy for you to log in and download your games.

31:53

[JM]: But I'm getting ahead of myself.

31:54

[JM]: The first thing I had to do was to choose between several available images.

31:58

[JM]: One of those boots into Steam Gaming Mode by default.

32:03

[JM]: And this is a good solution if you are connecting this full-time to a television, where you're typically controlling it with a controller, say on your sofa, and you're not sitting there with a keyboard and mouse, and you want to be able to just kind of tap things and say, okay, yeah, right, right, left, left, select this game, play it.

32:24

[DJ]: Basically, if you want to treat it sort of like a gaming console, at least in terms of user interface.

32:30

[JM]: Right.

32:30

[JM]: I think Steam calls it Big Screen Mode.

32:33

[JM]: But unfortunately, with Nvidia GPUs, there are currently some issues with this Steam Gaming Mode, including potential problems playing games in 4K or HDR.

32:45

[JM]: And also I wasn't really sure how I was going to use this because again, this thing is portable and I could theoretically move it occasionally from my office into the living room.

32:57

[JM]: And so I wasn't sure that it was going to be perpetually connected to the television.

33:01

[JM]: So it didn't seem like that was the right choice.

33:03

[JM]: So I chose the other image.

33:04

[JM]: In terms of the desktop environment, because again, I'm having this not boot directly into Steam Gaming Mode, there's a choice between KDE and Gnome.

33:13

[JM]: I don't have a lot of experience using Linux on the desktop.

33:17

[JM]: I've done it before, but not enough to have a preference for one or the other.

33:21

[JM]: It sounds like KDE Plasma is the one that a lot of people use, so I was happy to just follow that one.

33:29

[JM]: So now that the image selection part is done, I downloaded this 8-gigabyte image.

33:34

[JM]: I used a tool called Balena Etcher to flash it onto a spare USB drive that I had lying around, fired up the PC, changed the settings in the BIOS to boot off of the flash drive.

33:48

[JM]: And from there, everything was really easy.

33:50

[JM]: Installation was super simple.

33:51

[JM]: And I have to say that despite the perennial meme joke, that is, "This is the year of the Linux desktop."

33:58

[JM]: And that's a joke because it's never the year of the Linux desktop.

34:02

[JM]: We all want it to be, but it never seems to arrive.

34:04

[JM]: I have to say, I've been really impressed with it so far.

34:08

[JM]: The desktop environment is easy to use.

34:11

[JM]: And so far, I haven't really had many problems.

34:13

[DJ]: How does it do with playing the games?

34:15

[JM]: That's the important part, right?

34:17

[JM]: Logging into Steam was super easy and the handful of games that I have tried it with have all run flawlessly.

34:23

[JM]: I haven't run into anything glitchy or weird, which is again, something I don't think I can even say about Windows itself.

34:32

[JM]: Like, even running games on Windows was glitchy.

34:35

[JM]: Like, there were plenty of times I would be playing a game in Windows and there'd be some weird glitch that would often just bring down the whole system.

34:43

[JM]: This was done using a 4K monitor that I moved from another room in the house to my office just so I could have it near me while it was installing and getting set up.

34:55

[JM]: And then I moved it downstairs to the living room, connected it to the television, ran great from there.

35:00

[JM]: But moving it back and forth is a big pain.

35:04

[JM]: You got to disconnect it, move it down there, reconnect it.

35:07

[JM]: This just ends up being more friction that keeps me from playing games, or at least it gives me incentive to pick one location and just leave it there permanently, which isn't ideal because there are advantages to being able to play in more than one place.

35:22

[JM]: Thankfully, I have what is probably one of the best purchases I have ever made connected to my television.

35:30

[JM]: And that is the Nvidia Shield Pro.

35:33

[JM]: Back when Nvidia cared about games instead of generative AI stuff, they produced this fantastic product that, to my knowledge, they have not touched since it came out.

35:46

[JM]: I think there might've been one version of the Shield Pro before the one that I bought, but since I bought mine, I don't know how many years ago, I don't believe they've done anything with this product since.

35:55

[JM]: It's based on Android OS, and it's just a very, very small -- like the size of a large phone -- small black thing that I connect to my network, my television, and this USB dongle that I bought years ago...

36:11

[JM]: that I think might've been made by Microsoft, that essentially allows Xbox 360 controllers to connect to it wirelessly.

36:19

[JM]: I happen to have these old Xbox 360 controllers lying around and despite being I-don't-know-how-many-years-old at this point, they still work great.

36:28

[JM]: They're basically indestructible.

36:29

[JM]: So where does the Nvidia Shield Pro come into this equation?

36:33

[JM]: Nvidia developed something called GameStream.

36:37

[JM]: And the idea is that you can have a PC running Windows somewhere else in your house, running this Nvidia GameStream software that often came bundled with the driver, the Nvidia GPU driver.

36:50

[JM]: And the idea is you could leave your big, massive PC tower -- because that's what most people have -- wherever it is.

36:58

[JM]: But then in your living room where you don't want this big, ugly, noisy thing, you can have this tiny little device connected to your controller

37:06

[JM]: that streams the game over the network.

37:09

[JM]: So the game isn't playing on the Nvidia Shield Pro.

37:12

[JM]: It's playing on your big, noisy Windows PC elsewhere in your house, and it's just streaming the game over the network.

37:19

[JM]: And this works remarkably well.

37:21

[JM]: And I use this on occasion, even when I was running Windows on this box.

37:27

[JM]: Fast forwarding to the present day, Nvidia doesn't care about GameStream anymore, and I don't think they're developing it any longer.

37:35

[JM]: Thankfully,

37:35

[JM]: a bunch of really smart people thought, well, these are great ideas that worked really well.

37:41

[JM]: So we are going to build tools that replicate this.

37:45

[JM]: And those tools are called Sunshine and Moonlight, respectively.

37:50

[JM]: Sunshine is the component that runs on the computer that's actually playing the game or powering the game.

37:57

[JM]: and Moonlight is running on the client or the device where you are.

38:02

[JM]: Naturally, Bazzite comes with Sunshine bundled, and there was just a simple toggle box to flip it on.

38:10

[JM]: I could have used the existing GameStream functionality on the Shield Pro at that point to connect directly to Sunshine, but I thought, you know what?

38:19

[JM]: They don't care about this anymore.

38:20

[JM]: I'd rather try a tool that's actually supported and improved and maintained.

38:24

[JM]: So I installed

38:25

[JM]: Moonlight from the Google Play Store on this Android OS-powered Shield Pro, and it's awesome. You launch it, and it says there's three icons, like high-res desktop, low-res, and then the one I actually care about, which is Steam. As soon as you tap on Steam, it automatically launches the Big Picture Mode, and you can use your controller to stream whatever game you want.

38:53

[JM]: So far I've tried it with two different games because this is all very new, and both of them ran flawlessly in 4K, high resolution, no stuttering, no lag.

39:04

[JM]: And the only thing that's missing here is that at some point I need to return this monitor back to where it belongs.

39:12

[JM]: But computers typically don't like it when you try to run them without monitors attached.

39:17

[JM]: And there are ways to create virtual displays.

39:20

[JM]: But that's a lot more monkeying than I really want to do.

39:23

[JM]: If I can solve the problem with a $10 HDMI dummy plug, which I ordered and just arrived today... It's a tiny little nub, the size of your thumbnail, that you plug into the HDMI port, that tricks the computer into thinking that a monitor is attached.

39:41

[DJ]: So this is to get past the thing where like the computer won't boot because I'm assuming the operating system will run.

39:47

[DJ]: But like the computer's BIOS might just be like, hey, there's no monitor.

39:50

[DJ]: What's the blocker there?

39:52

[JM]: My understanding is the blocker is more related to the resolutions that you can play the games at.

39:58

[JM]: So I'll give you a different example.

40:02

[JM]: Say you had a monitor that wasn't 4K...

40:05

[DJ]: Oh, you can't get the game streamed in 4K from the host computer if the host computer doesn't think it's connected to a display that can display that resolution anyway?

40:19

[JM]: That's right.

40:19

[JM]: So if you were connected to a monitor that could only do 1080p, for example, then you can't stream at 4K.

40:26

[JM]: So I tested this earlier today, and once again, it works flawlessly.

40:31

[JM]: It thinks the monitor is attached.

40:33

[JM]: It thinks it's running at 4K.

40:35

[JM]: Everything just worked.

40:36

[JM]: The last thing I'll note is it left only one unsolved problem, which is I can now leave this in the office, play it in the living room without having to move anything or disconnect anything,

40:47

[JM]: but the remaining monitor in my office is an Apple Studio Display, which is a monitor that rather infamously does not play nicely with non-MacOS platforms.

40:59

[JM]: But after poking around, I was able to find a cable that is DisplayPort on one end

41:04

[JM]: along with a USB-A port and Thunderbolt on the other end.

41:08

[JM]: So I plug in the display port and USB-A cable into this Linux box.

41:14

[JM]: I plug the Thunderbolt cable into the back of the Apple Studio display.

41:18

[JM]: Everything just works.

41:19

[JM]: The point of the USB-A cable, apparently, is to deliver, among other things, the audio.

41:27

[JM]: So I was instantly able to fire up a game and play it and hear it from the very decent speakers that come with the Apple Studio Display...

41:38

[JM]: without having to do any other connecting to external speakers or plug-in headphones.

41:45

[JM]: So with a relatively small amount of effort, in the grand scheme of things, particularly compared to the countless hours I wasted trying to use Windows with this thing, just to play a game, which is supposed to be relaxing, by the way... Super, super relaxing to futz with something for countless hours, just to...

42:06

[JM]: end up sometimes not even playing a game just being like, "Oh, well, okay, that was a couple hours wasted where I didn't even get to play a game."

42:11

[JM]: "I'm just going to like turn this thing off and go do something else."

42:14

[JM]: So to have a very short investment of time result in such a pleasing and easy solution for playing games now, both in the office and downstairs in the living room, without having to do a lot of monkeying is amazing.

42:31

[JM]: Super satisfying, and I'm really happy with this.

42:34

[JM]: And it's, again, really early days.

42:36

[JM]: I just got it all set up, but so far, really impressed with it.

42:40

[JM]: Highly recommend it.

42:41

[DJ]: That's really exciting.

42:42

[DJ]: I've had my eye on Bazzite Linux for a little while also, because likewise, I have a gaming PC, but of course it's running Windows 11, which I hate.

42:54

[DJ]: And just for a variety of reasons, it hasn't even been like...

42:58

[DJ]: I haven't had the problems that you have, at least not yet, where it unilaterally installs drivers that break my setup.

43:05

[DJ]: But there's just a million things that I don't like about it -- about Windows, that is.

43:10

[DJ]: I'm also trying to run the same computer as an always-on home server, where I deliver the services

43:17

[DJ]: that I want to run on it through Docker, like through containers, which you can do on Windows, but it's weird because Windows has a thing in it called Windows Subsystem for Linux, and you have to run Docker using that because Docker is built on, as far as I know, essentially a Linux or Linux-style form of virtualization that has to be bolted into Windows with this Windows Subsystem for Linux.

43:45

[DJ]: It's all just kind of weird and janky and I don't like it.

43:48

[DJ]: So I've wanted to install... I've wanted to try out Bazzite, but there is of course substantial friction with changing the operating system on your machine.

43:58

[DJ]: It's very pleasing to hear that so much of this stuff works smoothly, especially to the degree that this like open source software, which is notoriously, you know, kind of clunky and half-baked and good luck with it...

44:10

[DJ]: now works this smoothly is really exciting to hear about.

44:14

[DJ]: And also that there are these hardware solutions to the variety of things that you described, like getting an otherwise headless system to think that it has 4K resolution, or getting the Apple Studio Display, which as you said notoriously does not get along with non-Apple computers...

44:34

[DJ]: to work seamlessly.

44:36

[DJ]: This is all making me want to finish recording this podcast and then run over and reformat my gaming PC.

44:42

[DJ]: And since I have today off, I might... Maybe I'll spend it doing that.

44:46

[DJ]: Probably I won't, but I might.

44:48

[JM]: Well, if you do, and if you have a spare drive lying around that you can use instead of using the existing one that has Windows on it, you can, if you so desire, dual-boot between your Bazzite drive and your Windows drive.

45:05

[JM]: So you can transition

45:07

[JM]: without having to necessarily say goodbye entirely to your existing setup, if that's something that's important to you.

45:14

[JM]: In my case, I didn't know how this was going to go, so that's what I did.

45:18

[JM]: I took a NVMe drive that I had lying around, I put it into the second slot in my motherboard, changed the boot order in the boot selection BIOS screen, and that was it.

45:31

[JM]: So that's an option if that's something that you want to pursue.

45:35

[JM]: All right, that's all for this episode.

45:37

[JM]: You can find me on the web at justinmayer.com and you can find Dan on the web at danj.ca.

45:43

[JM]: Reach out with your thoughts about this episode via the Fediverse at justin.ramble.space.