Changelog Interviews – Episode #446

xbar puts anything in your macOS menu bar

with Mat Ryer from Go Time

All Episodes

On this episode we’re talking with our good friend Mat Ryer whom you may know from the Go Time podcast. Mat created an awesome open source tool for putting just about anything in your Mac’s toolbar. It was originally written in Objective-C, but it just got a big rewrite in Go and abig rename from BitBar to xbar.

If you don’t use a Mac don’t hit skip on this episode quite yet! There are lessons to be learned for anyone interested in hacking on tools to make your life better. Plus, with this rewrite Mat has positioned xbar to go cross-platform, which we talk about as well.

Featuring

Sponsors

InfluxDB – InfluxDB empowers developers to build IoT, analytics, and monitoring software. It’s purpose-built to handle massive volumes and countless sources of time-stamped data produced by sensors, applications, and infrastructure. Learn about the wide range of use cases of InfluxDB at influxdata.com/changelog

LaunchDarklyShip fast. Rest easy. Deploy code at any time, even if a feature isn’t ready to be released to your users. Wrap code in feature flags to get the safety to test new features and infrastructure in prod without impacting the wrong end users.

Square – Develop on the platform that sellers trust! Use API Explorer to interact with, test, or play with your applications in Square. You can build, view, and send HTTP requests that call Square APIs with API Explorer. Get started with Square, check out the API Explorer, or the API Explorer docs.

Notes & Links

📝 Edit Notes

Transcript

📝 Edit Transcript

Changelog

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

Today we’re joined by a Go Time panelist and a world-renowned Captain Jack Sparrow impersonator himself… It’s Mat Ryer. Hey, Mat.

[in cpt. Jack Sparrow voice] Pleasure to be here, mate. I love your podcasts… I listen to them on the Black Pearl, mate…

[laughs] See, I knew he would have to break into it if I just brought it up, so…

Yeah… That’s why I’m not allowed to see the doc… [laughter]

Well played, well played.

That’s right, that’s right.

Mat, thanks for coming on the show.

Thanks for having me. It’s an absolute pleasure, and I do mean that.

I would say similar to Jack Sparrow, Go Time would not be Go Time without Mat, the same way that the Pirates of the Caribbean would not be what it is without Jack Sparrow.

That’s quite a compliment.

A quintessential piece to the puzzle, that’s for sure.

Well, I have so much fun doing it, and I meet such interesting people, and you can tell we have so much fun when you listen to it. So it’s just a kind of joy really to do this, and I appreciate doing it.

The number one question we ask is how do you find us, and it’s usually by a way of Go Time.

There you go.

Very often at least. Not usually, but very often.

Right, okay.

Once in a while… Well, actually twice now…

You’ve walked that one back…

Yeah, two people actually. Well, we’re hoping somebody else [unintelligible 00:03:03.01]

You’ve gone down a couple rounds.

No one’s ever said it. [laughs]

No, every once in a while… The next thing they say after that is “I don’t even write Go, but I love that show.”

Yeah, that’s the best [unintelligible 00:03:11.02]

I have had people say that to me… Yeah, isn’t it? What are they doing?

It’s like, “We’ve fooled you.” “What’s your problem?” Yeah. [laughter] Oh, man…

“What are you coding?” “Not Go… But I listen to Go Time every week.”

Yeah. Well, that is nice, because we do try and cover subjects beyond just the language as well… And there’s so much in tech to talk about. So I do like the fact that we do that. We did one recently on test-driven development (TDD). We really didn’t talk about Go very much at all… But the ideas just apply everywhere.

Yeah. Well, that’s why the community lens to that show was very important to get to, because that lets you do that. Like, what the community really would appreciate hearing from these people that represent this community, that thrive in this community. I think that’s the secret sauce, in my opinion. That’s what I love most about this show, is the community aspect of it. Sure, you are a good centerpiece to the show and you bring a lot to it, but it’s not just you; it’s a [unintelligible 00:04:11.02] of awesome people involved, and you bring your own perspectives and your own thoughts from the community and your own insights and whatnot - that’s what makes the show really special.

[04:21] Yeah, like I said, I love doing it.

One thing I’ve learned over the last couple of years that you’ve been on the show is that you came to Go in kind of a strange way - it seems strange to me - which correct me if I’m wrong, but I think you wanted to use App Engine, and App Engine supported Go, and maybe Python, I don’t know, maybe C++… But you’re like “Ah, I’ll take Go.” Is that basically the way it went down? Because you’ve been using Go a long time, so it stuck…

Yes… It was before it was even released, and it was Java or Python were the two options. I didn’t know either of them.

You also didn’t know Go though…

Didn’t know Go, but Go had a little EXP experimental by Johnny, which is very enticing, and I [unintelligible 00:05:02.05] couldn’t resist it… Funnily enough, I was able to build something very quickly, and that’s a nice thing as a developer. It gives you confidence to carry on… And kind of like get a bit hooked on building things, and you get a payoff very quickly when you can deliver things quickly. So that’s what happened, and I just kept going… And yeah, because the thing I was building was also kind of perfect for Go, it really fit into what Go was (I guess) for originally… So yeah, it was just nice. It was just kind of lucky… And I really got very lucky; that’s why I’m on Go Time, is because of being around for ages.

Yeah. How long have you been writing Go?

It is about ten years. It might be a bit more than ten years. Go isn’t even that old, or it might just be… It’s about 10-12…

Our birthdays are very similar. Because we interviewed Rob Pike - I think it was episode 3, I wanna say… I have to check the catalog, but this was so early days… We were like “Should we even do this show? It’s a new language from Google… Yes, of course.” But I didn’t know who Rob Pike was, that’s how green I was at the time… And it was right around the time we were born as a podcast, the Changelog, way back in 2009. That was the same timeframe.

Yes, that’s amazing, isn’t it? And I remember the first GopherCon in 2014… And I happened to be living in Denver, Colorado at the time, and that’s where the conference was. So it was just like down the street. So I just walked down the street and went to this conference, and just met all these great people - Brian, and Eric, and team GopherCon… I think Kelsey Hightower I met there as well… You know, it was just like a group of nice people.

One thing that stood out to me is it made a point of diversity. It was something it kept repeating on stage. They wanted to make the community a welcoming place for everybody… And that’s something that’s always been important to me, so that really resonated… And it just felt like “Yeah, this is the right way to do it.”

We definitely felt that love too, because neither Adam nor I are gophers in the sense of Go programmers… But Go Time was the second show. That was the one that we launched into. Or was it RFC? Those were both around the same time. But Go Time was definitely–

Go Time was first…

First second.

Because we felt the love too, specifically from Brian and Eric and many others in the Go community. It was just like “This is a really welcoming, fun group, and they want us here, so hey, let’s do a show with and for them.” It was really why Go Time started.

Yeah, that’s great. And I actually think Go Time has become quite an important part of the community as well… That’s why it really is an honor, if I’m being genuine for five minutes…

[laughs] You have to say it again, because we’re never sure with you. Is it sarcasm, is it straightforward?

This is genuine sarcasm.

This is genuine here.

You’re eating in to the five minutes where I’m gonna be genuine.

[laughs] We don’t give anybody five minutes. You’ve got 2,5. Go ahead.

[08:05] Okay. Well, I think Go Time has become a big part of that story as well, and it’s nice to go back and listen to random episodes in the past as well. It’s a very fun thing to do. And it’s all just kind of open and free for everyone to listen to. I think it’s great, so I’m really glad you did start it.

So are we.

Yeah. I think it’s also an honor on this side to be a steward of that thing, of that importance. We hold that responsibility very dear to our hearts to deliver that.

Yeah. I can tell.

Well, I’m not being sarcastic when I say Go Time today wouldn’t be what it is without you, because you invented the Unpopular Opinion segment, which really has become a staple of the show, and something that brings people to listen who don’t care about Go or write Go, but they wanna hear about these unpopular opinions.

Yeah.

That was all you, man. That was all you.

Yeah. Well, I remember – you know, it was a kind of meme on Twitter, which it still is… And it was sort of this idea – it’s a very tongue-in-cheek segment. There’s something cheeky about the spirit of Go Time that I think people do appreciate… And I get feedback in that vein occasionally. So yeah, it was – and then making the theme tune… Taking this silly idea way too seriously…

Exactly.

I always find it to be very funny.

So seriously that we take polls to find out if they’re actually unpopular… [laughter] Like I say in the intro, this is very serious business. We’ve gotta find out how unpopular these opinions are.

Yeah. That’s it. It’s unpopular opinions. And if your opinion is popular, you’ve really failed.

Yeah, you’re really not good at this. [laughs] Well, I do hold a record as one of the most unpopular unpopular opinions of all time, so I like to hold that over your head… I hold one of the most unpopular, which – should I just tell them what it was, or should we hold out and make them go listen?

Yeah, so my unpopular opinion was that I believe that JS Party is a better podcast that Go Time. And I make a great case for it on the show, so maybe we should link that one up. But the Go community did not agree with me whatsoever… [laughter]

How long is the segment on there, do you know?

My part? 60-90 seconds…

Well, play that right now.

So I’m not gonna come on a podcast about Go and say that JavaScript is a better programming language; I’m no fool. I wanna walk out of here alive. But. I will happily start a proxy war by saying that JS Party is a superior podcast to Go Time.

Ooooh…

You’re off our show. You’re off our show.

[laughs] Let me quantify this a bit, okay? I have some evidence. So more is better, okay? We have more panelists, we have more male panelists, we have more female panelists, we have more variety, we play game shows, we host formal debates, we write and rehearse poems, we explain things to each other like we’re five… You guys don’t explain anything to each other like you’re five.

Go Time records on Tuesdays, one of the worst days of the week. JS Party records on Thursdays. Thursday is closer to the weekend; obviously, better. We cover more topics… Go Time is about Go. JS Party is about JavaScript and the web. That’s twice as many things.

That’s cheating. That’s cheating.

That’s twice as many things, and we know the web is huge, so tons of variety…

You can’t take HTTP to a JS Party…

[laughs] So in review –

See, we do poetry…

… we have more awesome panelists, we have more variety, it’s on a better day… And this is the big finale point. You’re gonna like this one. JS Party has 100% less Mat Ryer, which means we really cut down on those awkward silences. [laughter]

That is quite the pitch.

It was good, wasn’t it?

Really well said, I would say.

Really well said.

Wouldn’t you agree?

[11:57] Yeah… Well, it’s funny. It’s funny, because I think that also as an idea is quite funny, of tech wars… Some people really do take it very seriously and arguing about languages and things… You know, Go and JavaScript together - you can make some amazing things. So yeah, JS Party is a good podcast, but… I don’t know.

Better podcast. Okay.

Not as good as – so that’s the thing too on that from, the wars thing. I wanted to scream “Same team!” This war thing - it’s good to compete. Competition is great, so I’m always in favor of that. But the warring, the actual fighting, sometimes even name-calling…

It’s too much.

It doesn’t help anybody, really. We’re here to innovate the future of technology, not win the individualized war.

Right.

Yeah. I think it comes from a place sometimes of - if you’re inexperienced, you don’t wanna waste your time with something, you want there to be a language that’s the one to learn, so you can really focus. So I think people are drawn to these tech wars for that reason. I know lots of examples of that, where people - because they’re new, they get sort of caught up in it… And I think with experience, when you’ve tried different languages and you realized that some are better at some things than others, and everything has its place, and sometimes it might just be what you find fun is the important thing… Once you’ve done that, you realize that it is quite silly to be fighting over this; we are better off when we use them together in the right way.

Well, maybe something that speaks highly of the community then is that - maybe you don’t know this, but I produce both of those shows, and I also contribute to both of the Twitter handles… And I’ve been trying to start a gang fight for a while… Mat, you know this. I’ve been trying to get JS Party versus Go Time to be a thing. I was thinking like – remember that scene in Anchorman where all the rival weather guys show up, and the rival news people show up, and they actually have like a slash and dash in the back alley?

That’s Anchorman, right?

Yeah, Anchorman. I’m like, “Let’s get that going between our podcasts, because you know, that’d be great for interest.” And no one’s biting. So I think the actual war between the JS group and the Go group is like surface-level, but there’s no teeth there.

Yeah. We love each other, really. Brick killed a guy.

[laughs] There you go. Mat’s seen it… Nice reference.

Just to loop back a little bit, I did confirm episode 3 of the Changelog; it was in fact titled “The Go programming language from Google, with Rob Pike, principal engineer at Google and co-creator of Go.”

Way back when…

Confirmed. Go back and listen to that awesome, but terribly-produced show. I mean, it probably sounds terrible, but great content, obviously. Different show back then, for sure.

Well, Mat, we didn’t bring you on here just to talk about Go Time for the entire show, we brought you on to talk about Bitbar and xbar, which are written in Go, and one is a rewrite of the other… Let’s start with Bitbar, let’s start with the origin. What it is, why you made it, what it was, and then we’ll talk about the rewrite, and where it stands now, and all that good stuff.

Yeah, okay. Well, it was many moons ago - I don’t know exactly how many moons, but it was probably around 2014. Bitcoin had just kind of come out, and I bought some Bitcoin. I had actually at one point 16 Bitcoin, so you can calculate –

Are you still holding?

No, I’m not.

[laughs] You wouldn’t be on the show if you were… You wouldn’t need us.

Yeah, I’d be on a much higher-class podcast right now.

That’s right.

It was 2,565 moons, just so you know.

Thank you, thank you. [unintelligible 00:15:33.05]

Do you know how many US dollars though – or sorry, British pounds.

No, don’t calculate that, please.

Or sorry, Euros.

35 million. 47 million Euros.

So you had 16 Bitcoin, and you must have wanted to watch the price of those Bitcoins in your menu bar. I’m putting this together. Is that right?

[15:48] There you go. Exactly right. So I wanted to just see the Bitcoin price in my menu bar. And there wasn’t really a way to do it. There was no app to do it, so I started to build the little project just for myself. That’s why it’s called Bitbar, because it comes from Bitcoin.

Gotcha.

And I realized that I was able to get the menu bit done, and I was doing it in Objective-C, which I didn’t really know… So I was able to get the menu bar pieces working, but I couldn’t make a web request to save my life in Objective-C. I’m not kidding. If you look at the code you need to do it, it’s –

I’ve done a little bit of it. It’s not straightforward, yeah…

Yes. Maybe it’s 15 lines of code if you do it properly, and I wasn’t doing it properly… So it was just sort of a pain point of doing that. So I thought “Well, I know how to do this with Curl, so maybe I’ll just do that and I’ll learn how to run a sub-process.” So you wouldn’t do that, I think, if you knew what you were doing.

But what that did is it gave a sort of abstraction, and meant actually that you could write other scripts, the output of which could go into the menu bar. So then I thought “Yeah, that’s quite nice, because that is not just what I want this for. In theory, other people could write it, or I could just write other ones myself.”

So I open sourced it and I used it, and a few people joined in and added some features… Actually, they added some great features, like image supports, and colors, and different fonts, and things… And then I think it was 2016, it popped into the top of Hacker News, and suddenly then it sort of went crazy, and got all this attention… At this point it was a couple of years old, and it just sat there dormant, as far as I knew…

You’d sold your Bitcoin, you’d moved on…

Yeah.

Do you still use it, to track anything else?

Yeah, I use it for lots of things.

I mean, back then, in 2016.

Oh. Yeah, probably, because there were always little things at the time I cared about… And it’s very hackable. Because it’s basically – if you write an executable, any executable, in any language you like, as long as it prints to STDOUT, each line becomes a menu item in the menu. And there’s a special way that you can cycle through these items in the actual menu bar, and then show these items in the dropdown… And then people added support for “If I click this item, then I’m gonna run some code and do some action…” You know, it was always very hackable, and that means that it attracts developer’s attention, because it’s a fun thing… And it’s almost like the boring bit of figuring out how to do the menus is done for you, and you just get to use your knowledge of something else to then build something… And that’s what happened when it got at the top of Hacker News. Suddenly it was this influx of plugins, people writing all sorts of things, and solving all kinds of crazy problems.

Well, that had to be a pleasant surprise… How many times did you have to submit it before it popped in? I’m just messing with you… [laughs]

Yeah, actually –

Once a day, every day, finally in 2016 it got on Hacker News…

I actually don’t think you can do that, can you?

I don’t know.

You just submit it once.

[unintelligible 00:19:08.02]

No, trueduke. Trueduke–

It might actually go in, but it probably gets buried immediately.

Yeah. It’s not my style, to be honest.

I think there’s statute limitations. If you submit the same URL that’s been submitted recently - I’m not sure what recently means - it will just upvote it. So it’ll count as an upvote… Which makes sense.

Yeah. That’s cool. No, it was trueduke on Hacker News posted it.

Trueduke? One of your sock puppets?

[laughs]

So what kind of user base came out of that? Because a lot of the Hacker News folks - they kind of hit it and quit it. It’s like big ol’ interest, and then here today, gone today. But you had substantial contributors, and like you said, it’s an open plugin kind of an infrastructure, because as long as you can create a program that writes to STDOUT in the format that you specify, then you can write a plugin pretty easily. So is that what really got all these people writing plugins?

[20:12] Yeah, I think so. I think it’s the ease at which you can contribute something, and the immediate pay-off you get. It’s that same thing that attracted me to Go, the fact that I was able to deliver something very quickly - I think that also applies there. And you can also do it at development time. You can make a script and iterate on it and refresh it and you just see it live updating, and stuff. So the development process is very easy. And that was kind of an accident, if I’m honest. I’ve since learned to really pay attention to developer experience, and user experience, even of dev tools - or maybe especially of dev tools. But I think it was a bit of a got-lucky really with that design.

I love that happy accident, because it was like your lack of Objective-C skills accidentally created a very nice abstraction that you probably would have by-passed, right?

Absolutely.

And you’re like “Wow, this is actually a pretty nice layer, because I can just shove whatever else I want in there as long as it conforms. Now I cannot just do Bitcoin.”

Yeah, that’s it. It’s kind of like taking a weakness and sort of owning it and turning it into a strength. And that’s the thing - often you see people… It’s sort of like they want to either compete, or they feel like they don’t know enough to contribute, and so won’t… And the lesson there is that sometimes do something different; if you know something, maybe you can contribute in a different way. It doesn’t have to be the obvious way. And I think that’s quite nice as well - step back, think outside the box and see if there are other ways you can do it. So yeah, I don’t know, maybe that was kind of a weakness of mine, where it just kind of turned into a strength…

What about that day though, the Hacker News day where it was popular? How did you find out? How did you react, in terms of did you dig your heels in and get back in with the community and start writing code again? You said it was dormant… So how did you react to this new claimed fame?

Yeah, so there was 65 pull requests in one day, and I was getting an email for all of it… So that’s how I found out, I just suddenly had lots of spam. And that was a big surprise… I had to take a day off work, because I wanted to reply to people in the community, and also wanted to get the plugins merged into the repo, so that other people could use them… So this instant community sprung up; it wasn’t something that grew organically. It was all of a sudden there were lots of people using this and lots of people contributing to it.

So it was great, it was like winning the lottery, or something. Very exciting. But also kind of nerve-wracking. And the original code wasn’t great. I really didn’t know Objective-C very well at all. People even submitted fixed where – you know, you have to manage your own memory then. I’ve since added the ARC stuff, the automatic reference counting for objects, and memory allocation… It didn’t have that. So you have to retain objects and release them at the right time, and things like that… So that’s actually really difficult to get right. So I think people also contributed there and fixed things and helped out…

So yeah, I was kind of a bit nervous, and a bit worried about that, but also just basically very excited that there were all these plugins, and I was excited by what the plugins were doing. It was people building amazing things with this, and it was great.

So go back to 2016. You’ve got all of this excitement, you’ve got all this [unintelligible 00:24:44.14] I would think it’s like a relatively finished piece of Objective-C software, that can read from any kind of executable… Why rename it? We know that it’s a rewrite, but why rewrite it? Joel Spolsky is gonna be mad at you… Or who was it that wrote the big rewrite post?

Joel Spolsky.

Was it Joel? Yeah, so second-rewrite syndrome, or whatever it’s called… Don’t do a rewrite, just keep on keeping on.

Yeah.

But you didn’t do that.

No. I think I kind of know where they’re coming from with that, but if the language dies, maybe do a rewrite…

[laughs] Okay. Well, well said.

Yeah. Objective-C really – you know, I started doing Go, obviously, so I’ve just spent all my time on Go, and not doing Objective-C, and then Swift came out, so then people are using Swift instead… So not just me, it was – I couldn’t find contributors to help maintain the project, and there were some issues in some cases. And as the operating systems changed…

I was gonna say, that’s gotta be the problem, right?

Yeah. Little things like the vertical alignment of the text suddenly was different and needed work, and turned out to just be not easy to solve, especially if you don’t know Objective-C. So it kind of started going stale, and we just weren’t able to keep it alive. So yeah, the decision came, it was like – people were asking for it, and there were other projects that supported the Bitbar plugins (it’s now called xbar). So definitely people still like it and were still using it, so it seemed like the right thing to do.

And we did a Go Time episode with the creator of Wails, which is a Go-powered - and JavaScript… See? Best friends… Frontend – it’s a desktop app, for desktop applications. [unintelligible 00:26:43.28]

Is that what that means? [laughs]

Yeah, I think so.

Explain that, please.

It’s a framework for building desktop applications using JavaScript as the frontend and Go as the backend, and it uses a WebView, and with clever styling and some other tricks it really – you can do transparency in the window, for example… So it looks and feels like a real native app on the Mac. So we did that episode, which you can probably go back and listen to, with Lee Anthony… And I was chatting with Lee one day on Twitter, and he was telling me about Wails 2, the rewrite that he was doing, and I asked him “Do you think we’d be able to put together a desktop app for this and interact with the menu bars and things, and support this?” He was a little tipsy, because he’s in Australia; he lives in Australia. He’s from Wales - not the project; from the country Wales.

Which is why he called it Wails…

It is… Yeah, because it’s like Rails… It was like web-based.

With a w.

[27:50] Yeah. So I think it was that. So I was texting him, and he was tipsy, I think, is the polite way to say it… So he was agreeing, he was all over this idea; he was loving it. And I was like “Okay, maybe wait till the morning and see if you still feel the same.” And then about ten hours later I got a message that just said in all caps “I REGRET NOTHING.” [laughter]

That’s awesome.

So we set about writing the rewrite. And we got to write it in Go… So that’s nice. That means now the xbar project is maintainable, and we can work on it, and it’s well-structured, and it makes sense, and… You know, a rewrite is, I think, often better than the first version anyway, because you learn so much from that first version. So it kind of manifests that idea… And it looks nice.

We built a plugin browser, because it’s a proper desktop app it has transparency in the window… So it just looks gorgeous. And the project came back to life. So he loved it.

That’s cool. So I think project size also matters when it comes to the rewrite… I imagine a lot of Bitbar was the plugins, which were written in not Objective-C… And I’m assuming those all – you just adopted the same format, so those probably all work with xbar… Is that correct?

Yeah, absolutely. One of the goals was all the plugins had to work, because we didn’t want people have to rewrite or change the plugins in any way… That’s something I learned from Go, is that backwards-compatibility promise is so meaningful. It’s not just a nice-to-have; it actually takes more effort, but it’s so worth it… And it’s kind of showing respect to everybody that’s contributed to the project.

Right. So people warn against the big rewrite… But small rewrite, not so bad, especially when the version – I mean, it was kind of like you just shipped a prototype for a while. We’re supposed to throw away our first versions, right? That’s one of the problems with a lot of software, is we write our prototype, and a prototype is not meant to be the production [unintelligible 00:29:58.01] thing, right? It’s supposed to be the first version, by which you build the real thing. But we tend to just put those things into production and just build on them over time. It’s smart to write a thing – that’s why we have the term “spike”, right? Go spike out a thing, a proof of concept, a prototype, and then write it for real. Now, yours was just a really – I mean, you could think of it like a really one of those… And then when it came time to take it seriously, after it has a user base, it’s found a niche etc, now let’s take what we’ve learned and let’s do it in a language that you’re very proficient in, and do it right the second time. So I think that’s wise.

Yeah, I agree. I think that probably is a nice way to think about it. I mean, I like rewrites, actually. Hemingway famously said “There is no writing but rewriting”, or something like that… When you’re writing something, the first version of it really isn’t a thing yet.

Yeah… And what would that quote look like the first time he wrote it…?

Yeah, it was probably awful. It was probably like “Writing, but not writing, but do it twice.” [laughter] It was probably that, you know what I mean? It didn’t quite–

Yeah, exactly. Well, a lot of our thoughts are formed through the process, right?

Yes.

That’s where you’re getting. I agree.

That’s where I’m getting. Yeah.

He’s also famous for the shortest story, I believe, ever… “For sale, baby shoes. Never worn.”

Oh…

It’s a little bit dark, so sorry about that.

You killed the mood, Adam…

Yeah, my bad.

No, but that’s kind of beautiful.

That’s the thing though - writing code and writing words though is very… I think you have to draw a parallel there, because I think famously Hemingway also said “You’re always writing. Just get it out there. Whatever it is, just get it out there.” Because it’s like temporary art until it’s perceived and executed upon. Then it can actually be iterated upon, others can view it… It’s something. It’s substantial at that point. And we make this deal about rewrites, and I think contextually, as you’ve said, it does make sense.

Yeah.

The argument is contextual.

[32:02] Yeah. You just learn. It’s what you learn in that process. And honestly, even to the point where I really resist designing software too much. There is obviously value in designing software, and you should be designing software, but you can definitely very easily over-design upfront, and then you’re sort of locked into these ideas you had at the beginning when you knew the least.

Right.

So yeah, I think through that process and the learning that pops out of that, and the opportunities that pop out, too… I didn’t design xbar the way it was. I got there because I’ve tried to make a simple web request, using Objective-C, and I couldn’t do it because of NSURLRequest object didn’t make any sense. [laughter] I’m not kidding. Oh, it was a nightmare.

Oh, I know you’re not… That’s why it’s funny.

Yeah, so I took the opportunity then.

So is Wails cross-platform then?

Yes, Wails is cross-platform, which means xbar will be cross-platform, and that is also very exciting.

That’s cool…

Yes.

So you get that for free. So Bitbar - and xbar today - is a macOS menu bar app, right?

Yes, that’s right. But in the future, it will become cross-platform. And of course, all the plugins won’t necessarily make sense, because a lot of them are specific to a Mac, so there will have to be some way – there’s actually metadata inside each plugin… And I actually wouldn’t mind spending some time talking about the design of the API as well…

Totally.

It kind of has its own benefits, too. But there’s metadata in there, essentially, inside the plugin somewhere. It can be anywhere in the code, usually in the comments, so you can’t see it… And of course, the comments can look like anything, because you can write plugins in any language. So we’ll probably have metadata that says which platform it’s for, for the plugins, and we’ll be able to then – yeah, maybe multiple platforms, because…

Yeah, I was gonna say, it could be multiple platforms even.

Yeah.

One plugin.

Yeah.

So xbar parses arbitrary language comments in order to extract metadata? That sounds like a bad idea.

Yeah, does it? Well, it worked…

It just sounds harder than just like “Well, why don’t you just define a format for metadata?”

Oh no, there is a format, but it’s like XML tags, but they can just appear anywhere in file. It’s very loose…

Oh, okay. I thought you meant you could just willy-nilly, put a comment wherever you want… Because like you said, different languages indicate comments in different ways. Okay… That doesn’t sound quite so bad. It sounded pretty bad at first, so thank you for clarifying.

Yes, that’s alright. But that’s nice, because in xbar we added variable support. One of the things that lots of the plugins had was if you had to configure something - like, if one of them is a currency, it shows you the currency rate, so you could edit the script and choose the currency that you wanna see. Well, what we wanted to do was make that user experience a little bit better, so we added explicit support for variables, which – they’re environment variables, really. You define them in the metadata. They show up in the UI and let you edit them, and then when xbar runs the plugin, it sends those environment variables in, you use them in the script, and that’s now how you do configuration, and things like that.

So that’s a new feature that came from xbar, that we didn’t have in Bitbar.

So tell us more about the feel and the process of writing Go with Wails in order to produce what will be a cross-platform, but is a desktop application. You said it’s like web technologies. Can you tell us what that felt like to use Wails, and to build a Go project that’s gonna run on a Mac as a binary? Maybe even just the distribution stuff would be interesting.

Yeah, yeah. Well, fortunately, the Wails project does a lot of the heavy lifting for you. I mean, you essentially can use your own UI frameworks, and I quite enjoy building UIs as well. I got into Svelte, which is a UI JavaScript framework, and it has a similar philosophy as Go, in that it tries to be minimalist. It doesn’t do everything, it doesn’t give you all these complicated features. It gives you a small feature set, just enough, and therefore it’s kind of easier to use.

[36:14] And it also has this other effect that I’m sure is well known - it basically does a lot of its work at compile-time, not at runtime. So in theory that makes the projects much faster when you use them. And to be honest, you do notice that I think they’re very snappy UIs when you use Svelte…

So that was it. Frontend was Svelte. There’s an API that Wails gives you. You can just expose Go methods to the frontend and call them in JavaScript. It’s all transparent, so it’s very easy, and it’s kind of like a promise API, so you make a call to the backend, you get back a promise… If there’s an error, then you use the catch to handle it. So it’s very natural, like building a web with a server, but the server just happens to be running locally on the machine. And then the Wails tools packages it all up and bundles it together into a single binary. Then you run it, and that’s it.

There’s a bit of work to do, like to turn it into a Mac app… You have to pu tit into a certain folder, with extra bits of metadata, and things… But it’s quite trivial, and the Wails project really helps do that. So it felt very natural to me, because I build a lot of server-client applications like that, and it’s a joy to use, really.

Lee had to do work in Wails to support menus, because it wasn’t a priority. If you think about a desktop app, accessing the menu bar is not really something that most apps do. So we made a deal and he agreed to add support to Wails for that, and in exchange I sent him a MacBook M1.

A MacBook Air.

It was alright, it was a good deal.

It was a good deal for both of you.

That’s a good sponsor right there…

Well, he also wanted to make sure Wails worked natively on M1, so it was really a good kind of win/win all around situation… So that was nice. And he’s a genuinely lovely bloke as well, which - it helps when you like people.

And he regrets nothing.

He regrets nothing, I’ve got proof. [laughter]

That’s the best email subject ever. That’s awesome.

Yeah.

So you had all these Bitbar users… I know even big Mac people… I read about – I think it was Bitbar first… And I already knew you at this time, but I read about it on Jason Snell’s website, who is a Mac-based writer and journalist, and has a big following, his writings… How was the reception to xbar? Has everybody moved over? Is everybody excited? Was there any laggards, or complaints? What’s the situation with xbar?

Well, everybody is happy to just switch over, because if you’re a user of Bitbar, xbar had feature parity…

It’s the same thing, plus…

There’s no reason to not like it, yeah. And the other thing that happened which was very exciting was – this is just back to when it was Bitbar… Years ago, when I was young, I used to get this Amiga Format magazine, which was a computer magazine, it had floppy disks on the front, and it’d give you free stuff, and it had programs inside it, and all sorts… And I loved this. I think for my birthday I got a subscription to this magazine, so every month, I remember – my dad worked in the mines, so he’d get up very early… So he’d usually get up and get the post, and then leave the magazine by my bed, so I’d always remember, very tired, but just so excited that it was there; I knew it was there, and I couldn’t wait to wake up, but it was too early… So there’s lots of nostalgia around that particular magazine for that reason…

[40:05] And then years later – I don’t really bother with magazines, because the internet tells you all the things. And I just randomly bought this magazine one time, and I was just flicking through it… And I just opened up this double-page spread on Bitbar, and it was just like explaining how to use it and how to write plugins…

And honestly, that was like a thing. That was like a big deal for me then, that I’d gotten into this magazine.

What magazine was it?

It was MacFormat then. But it’s the same publisher. I don’t know if you have that in the U.S.

We have MacWorld, [unintelligible 00:40:38.06]

Yeah. It’s Future Publishing, I think; maybe U.K.-based.

That had to be quite a feeling…

Yeah, it was. I couldn’t believe it. I don’t really know how it feels, actually. It’s one of those – you can’t really articulate it.

Did you frame it? Did you hold on to it? Is it underneath your pillow? What did you do with the artifact?

I took a picture of it.

That’s it?

Yeah… And then my wife threw it out by mistake.

Oooh…! [laughter

Yeah…

At least you got the picture.

I got the picture, yeah. Exactly. That’s alright. I’m not very sentimental really, so I don’t mind that, but… Just the fact that it was in there kind of blew me away. But to answer your question - yes, xbar comes along and people like it.

Awesome.

Yeah. I actually got the – do you know the CEO of GitHub, Nat Friedman?

Oh, Nat Friedman.

Yeah, Nat Friedman got in touch through a friend, and wanted to have a chat… And he just loved it. He loves the project. That’s another one of those moments… And he liked – what he said was like “The taste of the design of those plugins.” And it’s because of things like – you know, you have to choose the refresh rate of a plugin, and you do that by including it in the file name. So you can do like five seconds… If it’s some clipboard plugin, it’ll be clipboard.5s.sh, if it’s a Bash script… And that will refresh every five seconds. And the fact that you can write plugins in any language… This kind of like very minimalist API really over what you can do. So that was another moment that was quite meaningful, because GitHub is, I think, a great platform for developers… So that felt like that was some good kudos.

Validation, yeah.

Yeah, I liked that.

I mean, paying attention too to the – not that this is a little project, but it’s not like Kubernetes, or like this gigantic community… It’s an indie project, indie dev, with its own motivations… It’s not this super-enterprise thing, and he’s only paying attention to the big things, so to speak, monetarily.

Yeah, I think that’s right. And I think the fact that it enabled developers, which is obviously a big focus at GitHub… But something he mentioned was it’s almost like just by making a different decision - which in the beginning just happened by accident, but just that change in the way you think about it unlocks things for other people, and enables other people. And then that multiplying effect that you can have always appealed to me, and Nat also mentioned the same thing, and that was – I liked that. I liked the fact that you can do this almost the same work that you were gonna do anyway, but just with that attitude of that slight twist on it, you can unlock things for others and enable others I think is nice, especially in open source projects.

So to me the coolest thing about this project is how extensible it is. Two aspects. First of all, there’s hundreds of plugins already written to just be used. So if you want something in your menu bar, the likelihood of it being in there is high. Secondly, if it’s not, you can just totally hack it together yourself, right?

So we talked a little bit about the plugin architecture, how it all works… I wanted to play a little game I called “Can xbar do this” So I’ve compiled a list…

Does it need a theme tune?

Some of these things are existing plugins, so it’s part quiz… Does Mat know his plugin directory? And it’s also part honest question, “Can it do this? Can I get it to do this?” So I’ll hit the list here, Mat. These are kind of yes/no questions, but feel free to elaborate…

Okay.

…if yes or no won’t cover it.

Can we play some dramatic gameshow music in the background, like [unintelligible 00:46:09.21]

Let me just check the budget… No, we cannot. Sorry.

Okay, fair enough. [laughter]

Alright, can xbar do this? Number one, can it show me the charging status of my BMW?

I do believe it can. I think I’ve seen that one.

That would be correct, except for I do not have a BMW, so the answer is actually no. But yes, it can do that.

[laughs]

Can it show me my Robinhood portfolio?

Yes, I remember merging a Robinhood plugin. So yeah. I think yeah.

That’s correct.

Oh, I’m nailing this… Two out of –

Yeah, you’re already nailing it. Two for two. Can xbar show me my current weight?

Uuh… Well, it’s a very polite application, so I don’t know about that… Can it? I don’t know. No, I don’t think so. I’ll say no.

I don’t think so. Now, the question is, how would we get that done?

I think it’s possible…

Where would you get the weight from?

Some sort of smart scale?

I think you would have to interact with a smart scale, for sure.

And some kind of API maybe to access it?

So that means – the next one is “Can it show me YOUR current weight?” I guess that’s also false. Okay, the next one… Can it check my Gmail for me?

Yes. There’s lots of email – in fact, email has its own category. You can see all the plugins at xbarapp.com, and I made a kind of menu bar that contains the category of all the plugins. It just mirrors the repo, so it’s very low-fi… But yeah, there are lots of email things in there, too. So yes. I think it’s yes.

[47:53] Can xbar buy and sell Bitcoin each time Elon Musk tweets?

[laughs] You could make it do that, if it doesn’t already. There are also loads of crypto – in fact, that might be the biggest area, crypto…

Probably. Crypto people have to know their numbers in real time.

Yeah, because you never know when one tweet is gonna destroy your future.

Do you know what’s ironic to me about crypto holders? They all talk about how they’re long-time holders, but they have to know the price every five minutes. It’s like, “Well, if you’re holding for the long-term, why does that matter?”

It’s all about marketing at that point, really…

Yeah… Can xbar rickroll me in 4k?

[laughs] I don’t know.

I guess the answer would depend. Can it play a YouTube video? You said there was image support…

Yeah, it supports images, not videos.

Okay. So feature request, okay… Can xbar generate passwords?

I haven’t seen that.

Oh, your first miss. It actually can generate passwords.

Can it?

There’s a password generator plugin, at xbarapp.com.

[unintelligible 00:48:58.26]

I thought that was a cool one. You know, if you have to grab a new password lots of times…

Yeah. But how does that work?

I don’t know.

I hope it’s random.

Which category is that one under? System?

Utility maybe? Or tools?

Yeah, there’s a password generator right at the top.

There it is.

Come on, Mat…

Come on, Mat… Can it show me how many people are currently on Changelog.com?

You mean the Google Analytics, or some of the analytics?

Well, we use Plausible, but does it support Google Analytics?

Yes, it does support Google Analytics.

Nice. I believe Plausible has an API now, so we can probably wire that one together.

Yeah.

What was the question again?

Can it show how many people are currently on Changelog.com? What if that was right in your menu bar?

There you go. That’s nice.

Talk about obsessing over numbers…

Yeah, that would be cool.

Can xbar tell me random dad jokes?

[laughs] I don’t think so.

You’re absolutely incorrect. It can.

Oh, it has a dad joke one? That’s amazing.

I know. That was the most intriguing one to me.

It does so much…!

I know…

Yeah. Actually, honestly, you wouldn’t believe some of them. The clipboard ones are my favorite.

I was very impressed.

There’s a lot of clipboard, or there’s a few clipboard-related plugins which do great things. One of them is a Base64 encoder, so you can copy some file, or you copy something, and then it runs periodically, so I think they have it to run every second, or whatever it is… And then anything in your clipboard - it will Base64 encode, and then you can just go and copy it immediately from the menu. That was one.

The other one was the clipboard history, which has been in there for a while, which shows you your last ten copies and pastes.

Yeah, that’s great.

And you can switch between them as well. I thought that was just really clever… Because that’s like almost an application in its own right.

I was gonna say it’s replacing – because I have an application; I think it’s called CopyClip, which is basically that functionality alone… And it has some niceties, where you can set how many it’ll keep, and it’ll automatically put it back into your clipboard when you click on it… Stuff like that. But if you can replace a bunch of little utilities with xbar plus plugins, that’s kind of a nice trait, if you ask me…

Yeah, yeah. Well, it is. And clocks, and music controls, and things like that are all in there. The time ones are very interesting, because there’s some funny ones, and then there’s some really useful ones. There’s a Unix time one, that somebody submitted ages ago… If you wanna know the time in Unix time all the time, you can.

It’s right there.

Yeah.

There you go.

So does it only run on a schedule, or can you actually interact – like, could you click a button inside xbar and trigger a thing to run?

Yes. And you can even wire up a menu item to tell it to refresh as well. There’s actually quite a lot you can do to the menu items themselves, including you can open a URL, you can run a script… That means you can actually – and if you have some state somewhere, which is up to the plugin how it does that, you can actually build quite interesting, interactive applications that turn out to be quite surprising as well. People in space…

[52:03] I’m excited to hear what our community of listeners come up with once they start playing with this thing, because the sky really is the limit. Let’s get back to this list here… Can xbar manage Adam’s PiHole?

[laughs] I don’t know what that means.

Adam, tell him about your PiHole.

Well, PiHole runs on a Raspberry Pi, and it’s essentially a DNS for blocking all the ads, essentially. It’s called a PiHole because it runs on a Raspberry Pi primarily, but you can probably run it on anything, honestly… But it’s best installed on a Raspberry Pi, because it’s a small device, pop in your network, and you point your DNS there. First [unintelligible 00:52:42.24] and it filters out all the ad tracking and all the retargeting stuff, and there’s a master list… It’s all open source on GitHub.

And how do you manage it now? Is there like a web admin or something for it?

Yeah, it’s just in an IP address which I won’t disclose, but… It’s a local IP address essentially, and it has its own web login; you can log into it. I’m pretty sure there’d be an API to it, so I’m assuming that you probably could…

Actually, that would be useful because the one thing I do often - or at least often enough - is log into it to disable it for a duration of time. They have a dropdown where you can say “Disable for 5 minutes, 10 minutes…” Because you might want to browse a site…

Totally.

…there’s links that break because of the tracking, so temporarily you wanna like “Okay, I’m cool with this link here. Let me do my thing, PiHole” and you sort of wanna stop it… But it’s a network-wide catcher for the whole network. So no matter what device – you’re not doing this stuff on individual devices. And every once in a while you wanna manage, at least toggling it on and off, or disabling it temporarily. So that would be kind of cool to have as an xbar thing.

Well, let me answer it for him, because Mat didn’t know what PiHole was, so he will not be able to answer. There is a PiHole manager plugin…

Oh…

So yes, you can manage that. And I can see where that would be a very confusing question if you’re not having any context there, Mat, so…

Yeah.

…I appreciate you just taking that with grace.

We won’t blame you.

Pie hole is your mouth, isn’t it?

[laughs] Yes, exactly.

It’s a pun on your mouth, yeah.

Yeah, it makes sense.

So [unintelligible 00:54:15.04] that would have also been correct.

It’s because your mouth is round, isn’t it?

Well, no, it’s not because it’s round, it’s because it’s where you put your pie. You put it in the pie hole.

I thought it had to do with Pythagoras.

[unintelligible 00:54:23.29]

Sometimes. Sometimes.

Can xbar show and manage Homebrew services? Let me just answer this one, because I’m excited. Yes, you can manage your Homebrew services. That’s a really cool feature.

Yes… So at this point I was like – because there’s a lot of stuff it can do… But do I want all this in my menu bar? So at that point you start to get overloaded, and you’ve gotta untuck, and hide, and things like that…

Yeah.

So does this really make sense as a menu bar thing? Could you give it a tiny UI versus just simply a menu bar? So maybe you can talk about how people push the limits of this and how maybe your menu bar will become super-cluttered.

Yeah, that is a fair point… And really, it’s kind of up to people, I think. But with the image support – it supports images, and the way that works is you Base64 encode the image and you literally print it out in a special way. So everything is just text-based and simple, but people have done some amazing things where they are dynamically generating and then encoding images, and things… But it can do it so it looks like an icon in the top. So you can actually keep it nice and neat for those times. Or just don’t install them all, you know what I mean? [laughs] That’s another way.

Well, they’re just so useful.

That’s kind of like when Firefox first added extensions… I probably had 75 extensions installed. My Firefox got very slow, and I got mad at Firefox, and I’m like “Wait a second, Jerod… You are also in control of all these extensions. You don’t have to install every extension that comes out.”

Yeah. There’s a plugin called “Is it up?”, which - you give it a URL and it just pings it and tells you if it’s up or not.

It’s so simple, but…

Cardi B would tell you…

Yeah, she would, wouldn’t she?

Anyway…

Is she related to Jason P.?

She might be. You’ll have to ask her.

Cardi B and Jason P.

I’d love to see those two collaborating.

A colab…

Yeah… Can we talk a bit about the effort into this, and maybe any commercial plans for this, being supported as a community developer… I know you’ve got a GitHub Sponsor, you’ve got some tracking in terms of a goal you’ve got… 54%toward your 50 sponsors goal… What are you doing there? How are things going on that front? Is it important to you?

Yeah, it’s interesting. Actually, it was Nat Friedman that said “You should set up Sponsors on GitHub.” When the project was first around, there was no such thing as GitHub Sponsors.

And he’s a sponsor. Good job, Mat.

He is, indeed, a sponsor. I think he’s my biggest sponsor, actually.

Would that be the $1,024/month “a bit creepy now” sponsor level? [laughter] What I love about this - let me take the mic here real quick… 2, 4, 8, 16, 32, 64, 128, 256, 512 and 1,024. That’s your tiers, which is just super-cool. I won’t even say the lines for each of those.

Yeah, go on if you want to.

That’s a lot…

It’s a lot.

I’d love to hear–

Pick your favorite three.

“A succulent Chinese meal.” [laughter] “Your stuff makes our stuff better.” “Your contributions are really making a difference to us.” “Keep doing what you’re doing! You’re really helping us.” “A couple of coffees, or one coffee in a fancy place.” That’s a few.

Yeah. Some places coffees are more expensive.

“Cheers! British for thank you.”

I like the $2, which is “A tip of a hat.” But $4 is “Two tips of the hat, or a tip from two hats.”

[laughs] That is good.

That is good. So that’s what I love about you too, Mat, is this humor you bring to just life in general… And I think your tiers are an example of that.

Thank you, thank you. It’s a coping mechanism, really. It’s like, if I look like I’m not taking it too seriously, I can’t really be too embarrassed if things go bad.

[laughs]

I would think that that would be seriously not serious then, because that serious enough to think through that detail and be that funny, but then not serious enough because it’s not like “Corporate enterprise sponsor.” “You’ve made my meal today.” I don’t know, it’s just a bit more… It’s just very funny.

Yeah. I don’t take it too seriously. I use the sponsorship there – my idea is to distribute that to other people contributing, because I do want to keep the project alive… And there is work to do. It doesn’t have a major release yet of xbar, so there are still some things that are being worked out, and there’s still some bugs and things in it… So if people are interested in contributing, I’m definitely interested in that. The sponsorship will be used in some way to facilitate that. It’s a tough one, because the tax is quite interesting on sponsorship money, and stuff like that… So there are some things to figure out. But I think I’ve got it sorted.

I hope GitHub does something about that at some point, because that’s what OpenCollective has done well, was remove that portion… Because it’s generally – this gets into the details, but it’s generally some sort of fiscal sponsor… We talked with Pia, which we’ll have out before this episode, so you can go back into our feed and listen to that with Pia from OpenCollective and all the details around that… But it’s a difficult thing. It’s a difficult thing to support a developer, and probably definitely more difficult to support other developers by way of, you know? That’s challenging.

[59:49] Yeah. I do think GitHub will end up enabling that, at least, the sponsorship for a project… Because at the moment everyone’s sponsoring me on that. Not everyone… In fact, if you want to sponsor me, please do. But people are sponsoring me personally, and it’d be better if you could sponsor the project, and then we could somehow split that between the contributors.

So yeah, I’m not trying to make money from xbar. That’s not really what it was ever for. I did get sent loads of socks at one point, because in the readme I had an Amazon wishlist, because people were asking like “Can I send you some Bitcoin, or something?” I needed some socks at the time. But then I ended up getting about 200 pairs of socks in the post…

[laughs]

Seriously?

Yeah… And it was just the same pair of socks, 200 times. I’ve still got loads of them. I’ve got these red socks… So you’ll always see me wearing red socks.

Lifetime supply, there you go.

Yeah.

Problem solved.

Socks all around.

So that’s good… So your goal then is to - at least currently with Sponsors - generate enough sponsorship of you to give back to those who are contributing to xbar.

Yeah. I really want it to be used to keep xbar alive. There will always be work to do, and there were lots of feature requests which didn’t quite fit into – you know, you want it to be simple, but maybe there’s some places where it can be more complicated, and that’s okay… So there’s a tough kind of balance there with the feature set, as there always is in these kinds of projects… But like the Wails project - I’d like to get that some sponsorship from this as well, because it wouldn’t have been possible without that project.

And yeah, then it’s just a case of use it and build your own plugins and share what you’re built, tweet me. I love seeing people - the things they’ve built. And if you can, then also contribute that to the repo, xbar plugins repo. We’ll put the information in the show notes, I’m sure…

And yeah, please get involved. It’s a lot of fun, and… You know, your creativity really is your only limit in this.

Well, to get more Mat, you can go to Go Time and listen to Go Time, and get weekly doses, or hits, or tips from Mat. xbar.com… Is that right?

Xbarapp.com.

Xbarapp.com, thank you for correcting me. Or also github.com/matryer.

Well, hang on - you’ll edit it, won’t you?

We’ll just roll with it, right?

Oh, I thought you’d –

You’re the one who always says that, “They’ll edit this out. They’ll edit this out.”

You know that never happens, don’t you?

They never do. They leave it in.

Do you listen to the shows? Because every time you say that, it never happens.

So we just don’t say it anymore, because we know it’s not gonna happen.

I know. I actually think when you edit the podcasts – the live shows are always more raw, and obviously you make mistakes… But it’s not just the mistakes. I think you do such a good job when it gets edited together… The conversations just flow really well. I like to also encourage people to listen live and join in live, because it’s so much fun. We’re hanging out… It really feels like you’re just hanging out with friends, and then in a week’s time in your podcast app there’s a little podcast, “Oh yeah, we talked about that last week.” It’s great.

Well, Mat, we really appreciate you coming on the Changelog, and of course, we appreciate everything you do on Go Time, and in the Go community, and the open source community, and even your zany music videos you put out, and just the entertainment that you bring is such a fun aspect of developer life… So we appreciate you coming on the show and all these other things that I’ve just said.

Yeah, thanks for having me. My pleasure.

You’re welcome back anytime you rewrite xbar…

[laughs]

Changelog

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

Player art
  0:00 / 0:00