1. Library
  2. Podcasts
  3. Demuxed
  4. Ep. #20, Exploring Shaka Player with Joey Parrish
Demuxed
40 MIN

Ep. #20, Exploring Shaka Player with Joey Parrish

light mode
about the episode

In episode 22 of Demuxed, Matt, Phil, and Steve reflect on the 10th Demuxed conference and welcome Joey Parrish, creator of Shaka Player, for a behind-the-scenes look at Shaka’s evolution. With insights into Shaka’s open-source community, conference highlights, and the future of adaptive video, this episode offers a unique perspective on today’s streaming tech challenges.

Joey Parrish is a lead engineer at Google and the creator of Shaka Player, a widely used open-source JavaScript library for adaptive media streaming. With over a decade of experience, he has guided Shaka’s development from a simple player solution under Widevine to a versatile, community-driven project used across major platforms.

transcript

Steve "Heff" Heffernan: Yeah, hi everyone. Welcome to the next episode of the Demuxed podcast.

I was looking earlier today, and this is one of the rare times that we've had multiple in a year, I think, at this point.

Officially, somebody was saying that, like, as long as you have one a year, we're not dead. And so I looked in the history, and in 2023, we technically died. But we're back.

Matt McClure: Briefly. Briefly died.

Phil Cluff: It is Halloween, like, next week. So, we're basically zombies now?

Matt: No, no, no, we're fully back alive because of the podcast that we released, like, relatively recently, pre-Demuxed.

Heff: We've got a good thing going here. Let's keep it going. All right, today we got Joey from Shaka Player. Yay, woo.

Joey Parrish: Hi, everybody.

Heff: We just finished Demuxed.

Matt: Yeah, so the genesis of being able to even do this recording is we figured we've got Phil in town, we've got all these great attendees in town and people from the community here. Is anybody flying out late enough that we could pop in and do a quick recording?

So Phil was very excited to pull the recording equipment that was still in boxes from getting into the office from Demuxed last night. And Joey doesn't fly out for another couple hours, so we figured, yeah, let's have a chat.

So yeah, we just finished up Demuxed 2024, the 10th one, which, you know, the days are long, but the years are short and all that.

Heff: Yeah, congrats to you and Phil. That is a real accomplishment. 10 years, I can't believe it's still going.

Matt: I know. I wouldn't have guessed this nine years ago.

Phil Cluff: 11 years, technically.

Heff: Oh, because of "Demucked."

Phil: Mm-hmm.

Matt: Oh, because of Demucked. Yes, I can't wait to field questions about whether or not that was real for the next 10 years.

Heff: Which is weird 'cause it's half real.

Matt: All the best lies are half real. And also, huge shout out to, I mean, you know, Phil did a ton of work on this thing, but Victoria really held this thing together with duct tape and zip ties there, especially down the stretch.

So huge shout out for her part in this. If you missed the conference and you want to see it, or even if you were there, you want to catch up on a talk that you missed, you stepped out for a little bit, whatever else, as long as you have a ticket, you can go watch the recordings.

You have exclusive access as a ticket holder through, it's sad that we sometimes are scrambling hard to get them up by Christmas, but we try and have them all, we'll send them to editors, we'll get like a nice final cut of all of the talks with some light editing, and then we'll have them on our YouTube channel and our internal drop dead date is Christmas.

But if you do have a ticket, Dylan and crew have actually, and Justin do a great job of like, at least getting in a quick clip, along with chapters for each of the talks, so you can go through and watch, at least easily find and watch any of the talks you may have missed.

Phil: It's got the cute new media Chrome chapter selector as well.

Matt: It does.

Heff: Ooh, cool.

Matt: I was happy that got in there.

Phil: Me too.

Matt: So live.demuxed.com, just use your ticket code.

Phil: So you go to live.demuxed.com to get the VODs?

Matt: Yes. Should be at a redirect to vod.demuxed.com. Any favorite moments from the show this year?

Joey Parrish: Definitely the video tribute at the end. That was incredible.

Heff: Yeah.

Joey: Yeah. I really want to buy that on Blu-ray.

Phil: Well, for the low, low cost of $9.99.

Heff: Yeah, for those who haven't seen it yet, some of the Demuxed team put together quite an impressive behind the conference mockumentary. Is it a mockumentary? Is that the term? Documentary?

Matt: It's like the Spinal Tap of video conferences.

Heff: Yeah, yeah, yeah. Over the last 10 years and it was impressive.

Matt: Yeah, that was a highlight for me too. And Phil made Blu-rays of every past year's Demuxed, including a delightful box that has the details even down to the little tiny lettering that you can barely see that talks about the producers and actors and all that sort of stuff. It has all the speakers. The attention to detail is very impressive.

Heff: Apparently the Blu-ray menus too.

Phil: All of the menus are fully branded. All of the logos, yeah, everything.

Matt: I'm literally going like this afternoon, I'm literally planning on going to GameStop and buying a PlayStation 5 so I can have a Blu-ray player. I've been wanting a PlayStation 5 anyway and Alex has been like, "Do you really need one?" And now I can officially say, "Yes, I really need one."

Phil: I will show you later on how that font works that generates all that stuff at the bottom. There's a font called Universal Accreditation that has all those ligatures in it. It's all done as different ASCII character numbers. I have to remember ASCII character codes.

So certain ASCII character codes will map to produced by and starring and all those sorts of things. And then you have to type people's names in uppercase. Otherwise you just get based on a concept for Star Wars and things like that in the font. It's a very cool font and I will definitely use it again. But yeah, I'll show you later on. It's really weird.

Matt: Cool. Are there any talks that stood out to folks?

Joey: Yeah, I really enjoyed YouTube's talk about TVs eating your frames. I loved NBCU talking about test automation. You know, the super res stuff that John presented was really cool.

And I've got a whole list of things that I'm going to go back and watch on live.demuxed.com because I was downstairs in the socializing area just making so many incredible connections with so many people during just these two days.

It's amazing seeing old people that I've known from years past and meeting new people. And everybody's full of ideas and wants to collaborate and everybody wants to make this the best community.

And as much as I want to see the talks, it's those connections that are irreplaceable. And that's what Demuxed really is, I think. The hallway track is critical.

Phil: I think Strobe's, I hate to say it, like every year-

Matt: It's cheating to say Strobe's talk.

Phil: It's cheating to say Strobe's. I feel like, I think I said this to you backstage, I was like, that just feels like the straight up, the best audio talk we've ever had.

Heff: Yeah, you must have understood a lot more of it than I did.

Phil: I think it was Mike saying this morning, yeah, it would have taken me three hours to explain like half of what Strobe covered in that talk. Yeah, it's just the pace he moves at, my brain can't quite handle that sometimes.

Joey: I think if Strobe's going to do another audio talk though, you need to like, you know, not film him and just make him say it all. Like, it's an audio talk about audio, right?

Matt: We should get him on the pod is really what we should do.

Joey: That's better than my thing, yeah.

Matt: That's better than putting him behind a black curtain on stage. I also really liked Yingyu Yao, right, was the, yeah, his talk on the TV's eating your frames was really fantastic. I really loved that he was at Crunchyroll for one of the first talks. And he was talking about that like at the speaker dinner.

And then before he went on stage, he was telling me that this is his first talk, this is his first public speaking thing ever. And that was actually the case, I think there were four, at least four talks where it was the speaker's first ever public speaking.

And every time they'd get off and be like, I was so nervous, it was terrible. And they all killed it, they all were so poised on stage. I was so proud of folks executing that well.

And like a pretty high, I mean, that's like, that's not a meetup talk, that's like a, you know, you're sitting in front of 400 people plus, like, it's really cool.

Heff, you haven't gone yet. What what was your favorite?

Heff: I was just thinking like what the themes were. I definitely felt the theme, there's at least a couple around storage, like storage optimization that I thought was interesting, especially as like, I'm thinking about UGC content a lot more and like the value of content.

And there was one on like very advanced optimization and smart cold storage.

Phil: Yes, more maths that I completely understood on those equations on the stage, yeah.

Heff: Then there was kind of a theme around noise, like noise insertion, like film grain noise, like I don't know.

Matt: Or not losing noise was another big one. Like, so even like the upscale were like, yeah, it was interesting.

Heff: It is weird that there's like a theme around that, but yeah.

Matt: Well, cool. So, you know, the win here this week was getting to get in a room with Joey, which is always a pleasure, but this is especially fun. I mean, we've got, I think, two of probably the biggest online video, open source video players, two originators in the same room on a podcast. That's kind of neat.

So yeah, Joey, Joey's the creator of Shaka Player. Why don't you introduce yourself, Joey?

Joey: I'm Joey Parrish. I have been working on Shaka Player for 10 years now. And we started the project under Widevine, where Widevine had been getting a lot of feedback from partners that all this newfangled dash stuff was just kind of complicated and they didn't want to stop using proprietary plugins when we were trying to get rid of all of those in browsers.

So Widevine offered to build something for that. And that's where the Shaka Project came from. So there was actually a kind of a bigger effort proposed. So our, I forget exactly what his title was. One of our muckety mucks higher up the chain had been from South Africa.

And he said we need to unify all of these different aspects of the media ecosystem. And, you know, so for him, it was inspiring that Shaka had been the unifier of the Zulu people. And so there was this code name Shaka Project and there were three different sub projects within that that were going to like bring the easy button to all these different aspects of media.

And so there was the player, there was the packager, and there was a third project that actually never came out. So it got canceled and probably shouldn't say too much about it because of that, but okay.

Matt: Oh man.

Heff: So how did you get to Widevine? Like, how did you come to Widevine?

Joey: How did I come to Widevine? Yeah, so I started my Google career almost 13 years ago at YouTube. So I was here in the Bay Area and working on the YouTube game consoles team.

And so that was my professional entry into video, but I'd been doing some open source hacking before that, MPlayer and things like that.

Heff: Yeah, cool. I remember MPlayer. That was a good project.

Joey: MPlayer was my entry into video space because I, in college in like 2000, 2001 type timeframe, I was really desperate to turn a DVD into an animated GIF. And there just was not a tool for that.

And my minimal research seemed like MPlayer was the right tool to add that to. And so that was my first open source commit as a GIF output module for MPlayer.

But eventually I, after working at some, non video startup in Texas, I wound up at YouTube. And then from there I wound up at Widevine primarily because I did not think I could afford to buy a house in the Bay Area.

And Widevine was near Seattle. So it was more about a place for me to move where I could afford things. But I ended up being at Widevine for eight years. And that was where we started the Shaka project.

And as I said before, we started, there were three different prongs of this project. There's the player, the packager and this other thing. And the packager actually I think came out first and they decided when they went public to name it the e-Packager, which was maybe not the name that everybody liked in the end, but-

Matt: e-Packager?

Joey: e-, like little E capital dash. I guess that stood for embedded, but it was my teammate KQ who was involved in that. And then when it was my turn to publish, we had been racking our brains for six months about what are we going to call this thing?

And we just couldn't come up with a better name than the code name. So we just launched it as Shaka Player. And yeah, eventually E-Packager decided to rebrand as Shaka Packager.

But initially I was not involved in the packager, but over several years, needs within Widevine, within Chrome Media changed and that ended up coming over to my team as well.

And then about two and change years ago, we moved the project over to Chromecast and that is the new home of that. But as part of that process also, we didn't have quite so many resources to work across all these different open source projects.

Chromecast is primarily concerned with playback. And so we went through this transition phase where it wasn't just like bringing Packager under the same team, it was more about bringing Packager in and sort of trying to revive it and then open it up and open the doors on all these projects to more active contribution.

And it wasn't that we hadn't taken contributions before, but it hadn't really been a thoughtful process before. And there were days when someone would have something they wanted to do in Shaka Player and I would just say, "No, that's not the direction that I personally want to go."

And that was a little short-sighted. And the plan now is to really make all of these projects as open and community-based as possible. Now we have as many non-Google maintainers in Shaka Player as we do Googlers working on the project.

Heff: That's awesome.

Joey: And we went through this transition where we said, "Okay, all this weird private Google-only stuff we're doing, let's replace that, let's change that, let's build on GitHub Actions."

If you're a maintainer in Shaka Player, you have rights to run test passes in the private lab that we run in the Kirkland office. So we have real devices instead of VMs.

And yeah, so just really tried to open everything up and democratize everything as much as possible because not only was I kind of a benevolent dictator before, but that also makes you a bottleneck and that just wasn't going to cut it.

Now the Packager, I believe we only have one non-Google maintainer, the Shaka Packager, and that is Cosmin at Meta. And so we're still looking for more people who want to contribute there and be more active in choosing the direction of that project.

But in general, we're just trying to be more community-oriented and not just in terms of who's writing code, but in terms of who's making decisions and who's generating ideas and where are we going next.

Heff: Well, I was going to say, I have a general idea of where the Shaka Player gets used, but it might be worth kind of just rounding that out. They're like the major platforms where Shaka gets used.

But I don't have a good idea of necessarily where the Shaka Packager gets used, so it'd be interesting to hear that.

Joey: Yeah, me neither.

Heff: Okay, that's fair.

Joey: I'm sure there are people with more history who were involved over more of those years.

So the Packager can run in two different modes. You can build it as a shared library and integrate it into your pipelines and C++ interface, or you can build a command line and run it one-off or script it.

So I imagine if you are building Shaka Packager into your backend infrastructure somewhere, you're going the library route and you're connecting it to a bunch of other components, maybe Libav Codec, maybe other things, whereas the way that I tend to use it is generating test content or things like that where it's absolutely command line running on one machine, haven't heard of the cloud.

So, but yeah, I definitely had anecdotally that there were media partners back when KQ was running the project, there were media partners who were integrating Shaka Packager into their backends.

Unfortunately, I don't have relationships with those companies on that thing. So that kind of context has unfortunately been lost in the transfer of ownership.

It's the unfortunate thing about open source is that unless you are really particular about building in some sort of tracking or analytics, you just don't know who's using it or how. And none of the Shaka projects report back to us.

Heff: Until someone gets a bug and needs help with something. And then they pop in and it's like, "Whoa, you're using this?" Good to know.

Joey: Yeah, I'll see if I can tell this story without naming names, but I got an email once from somebody on their Gmail account and they were like, "Hey, I need help with this Shaka Player thing. I don't like this, I don't like that. I don't think it should go like this, yada, yada, yada."

And I read it and I thought about it and I replied and I said, "Those are all really great ideas. I actually love all of this feedback. I agree with you about all of these things, but yeah, we can't, I don't have the time to do that."

And then they replied back from their corporate account and they were like, "Well, I'm with this company. How about now?"

And I was like, "Oh, that's so amazing. I had no idea you guys were our users, but no, I mean, you're not paying us. It doesn't change anything."

Yeah, people are real funny and cagey around this stuff, especially when all the Shaka projects started under Widevine, really being promoted by Widevine. There's sort of a culture of secrecy around DRM and premium content.

So people report bugs and you say, "Well, how do I reproduce your bug?" And they're like, "Well, we can't tell you."

Like, well, that's going to be fun.

Phil: You're talking about a little, kind of mentioned like finding packages hard to use, but I guess one interesting place that Shaka's now really starting to be used is as a replacement on Chromecast, right?

Joey: Right. Yeah, so Shaka is the default player for Dash content on Chromecast. And there's a proprietary player that's still the default for HLS, but we're going to be changing that soon.

So you can already opt in if you have a Chromecast receiver app. You can opt in to use Shaka for HLS and we'd really encourage everyone to do that at the very least on a staging instance or something like that.

So you can find out if there are problems that maybe we don't know about, you can report them before this becomes the global default. But we will be doing a sort of a staged rollout experiment, gather some data and see like what will actually happen when we change the default.

And either then or now, in addition to opting in early, you can opt out early if you know there's problems. And you can say, I insist on holding off on this change.

But as long as your app sets an explicit flag, we're not going to change that. But the default, if you don't set that flag will be changing in the next, I'm going to guess six months.

Heff: Does that mean you're going to be like maintaining two different ways moving forward, play HLS?

Joey: No, no.

Heff: Okay.

Joey: The old way is not really going to be maintained anymore.

Heff: Got it, yeah.

Joey: That's a big part of the motivation to make this switch is that it allows us to put more of our, frankly limited resources into one unified platform. And then there's also an advantage for the customer too, because the Shaka Player is actually decoupled from the Chromecast SDK.

So in your receiver app, when you configure the SDK at the very beginning of the startup of your app, one of the flags you can set before it loads anything is what version of Shaka Player do you want to load?

And so if we fix something in the player, I can push out a Shaka Player release in a day and we get maybe two releases a year of the Chromecast SDK. So if the bug is in the player, we can push that out. You can get that fix in a matter of days.

And if we are busy, you can contribute to that player, which you could not do with the old one, right?

Matt: Part of what you're saying there on trying to grow that tent to be a little bit less Google-centric around the contributions, don't want to put words in Steve's mouth, but I assume he would agree with most of what I'm about to say around...

I mean, we tried really hard with Video.js to encourage and foster external contributions. We tried a good first issue tag. We tried to lower that barrier to acceptance as far as possible.

I think as far as I could tell, I think the only things that really worked were Steve just like getting a pull request, be like, great, thank you.

And then doing a ton of work to just fix it and make it good enough to pull in and then pull it in rather than trying to do the back and forth with the maintainer.

Heff: Yeah, that's exactly the tension. It's 'cause you want to bring a contributor in deeper and help them navigate the code base, help them learn how to do things.

Matt: Train them.

Heff: And that is a lot of time. It takes a lot of work.

Matt: But you also want to help them get the win, right? So it's like, okay, if we help them get the first quick win and get a PR merged, will they stick around and now we can help them do this, self-serve this more the next time?

Or just curious, what tactics have you been trying and what's been working on that front?

Joey: All over that map. I've done everything that you've just said at some point. We'll probably do it all again at some point.

But it's like when you hire somebody and you have a new teammate and you could take the attitude of like, well, I don't have time to teach this person. I have my own stuff to do. But it's like that time you invest in them is a multiplier for your whole organization. It's worth it.

And the same is true in open source. It's like if somebody sends me something that's way off base, but they want to be there, it's worth it long-term for me to teach them if I can.

And so I think that part of being an open source maintainer, in my view, it's one part technical and it's one part organizational and it's also to some degree educational. You need to be a teacher sometimes.

Heff: Yeah, I totally agree with that. And also video players are hard in that for a lot of users of video players, they're just trying to get the video working. They might find a bug and contribute it.

But then if they're an application developer, then they're just moving on to the next component in their system that might have problems and unlikely to continue to be a contributor.

If that was to be a media streaming platform or something like that, then that's a clear place where you might get somebody to contribute on a regular basis.

But once you get to the application developer level, it's not like a React or something like that where it's like you're working in this thing every day. It's like this video player that once you get it working, you're moving on and that can be a challenge in this kind of niche space.

Joey: Yeah, it's a very niche space. And a lot of the people who use, at least my products are people who work for big streaming media companies. Random developers don't need Dash.

I've had so many people come and say like, "Hey, I just stumbled across your projects. I'm looking for a video player for my website and my family videos or my training video for my employee or whatever."

And I try to take time and explain to them like, "Yeah, I really don't think this is the project you need. I'm happy to point you at some resources about HTML5 video, but you don't need this. This is a lot of complexity that doesn't serve you."

Contributors do tend to be from these big companies. And so there is an opportunity to get them if you can influence not just the people, but the companies to take the attitude of like, "Well, this is a public good for our whole industry and we should be here."

Matt: This is not intended to be rolling a grenade out of the room or anything, but I'm just curious. I mean, two amazing projects, HLS.js and Shaka. Why would you pull Shaka off the shelf over HLS.js or vice versa?

Joey: You know, I'm not sure what the big advantages are of HLS.js over Shaka. I haven't spent a lot of time in their source code and I haven't used it personally. I am sure there are advantages to HLS.js over Shaka. You know, as I'm sure there are vice versa.

Part of the philosophy of Shaka is to be the easy button and to be the everything player. And so, you know, it's designed to be extensible. It's designed to be flexible. And for the easy stuff, it's designed to be easy to use.

You know, I'm sure some of those things are also true of the other project. But, you know, if you want to have one interface that plays Dash and plays HLS, and when you're, you know, stuck with native, you know, native HLS on an old iPhone version, then, you know, it'll do that too.

If you just want one API for all of those things, that is what Shaka is.

Matt: So an area that we're getting pushed on lately, when we're thinking about players is size.

Joey: Oh yeah.

Matt: And so, you know, where we've gotten pushed is like, yeah, I mean, this player looks nice and all, but like, it's X kilobytes, G-zipped, blah, blah, blah. That's way too much.

Joey: Yeah.

Matt: I'm curious, are you all getting pushed on that at all? Is it a concern?

Joey: Yeah, I've been hearing people talk about this for years.

Matt: Well, it's gone in and out, to be fair. Like, you know, I feel like there was a little bit where that was just like a little bit less of a concern, like connections had gotten fast.

There was the spin as little as possible, then it felt like we didn't have the focus on that. Now it feels like we've gone fully back to the... Perf, send as little JavaScript as possible world.

Phil: Yeah, I think a lot of that has come from accurate or inaccurate, the perception that like the lighthouse metrics have like dramatic impact on like page ranks.

And I think like a lot of people now trying to load video players like above the fold, background videos, you know, aesthetic videos that are part of the page, right?

And maybe aren't optimizing those for like a lazy load or that sort of thing, like something we've been down the rabbit hole of extensively. I think that has driven people back to like reducing play as eyes, like trying to get a dial as low as possible.

Joey: Yeah, so I've heard complaints over the years about the size of Shaka, but I haven't done this in a while, but at the time when I went and compared to some other open source players that did similar or same things, they were bigger.

And so, you know, yeah, Shaka is big and it's gotten bigger over time because we've added a lot more features. One of the things we built in kind of early and I'll be the first to admit that our build system is jank, but this custom build system we have, it outputs a monolithic build, but at build time you can customize what pieces go into that monolithic build.

So it's not modular in the way that you would want it to be modular. That's something we're talking about for the next year to be able to make it more modular, more composable and move to TypeScript. I think all of those things go hand in hand.

But, you know, today you can run the build script and say, you know, I want the complete build and then I want you to subtract the UI and I want you to subtract cast and I want you to subtract offline.

Or you can just say, I only want dash and I only want, you know, this other thing. I only want this subtitle format, you know. So you can do a custom build today and strip it down to the pieces that you need. And in that sense, it is modular, but we could do a lot more and we could do a lot better and we plan to.

Phil: Captions, like that's one that comes up a lot when we look at it. And it's why I think quite a lot of people that visit Video.js build without captions. Just because that's actually a good chunk of the bundle size at this stage.

Matt: Yeah. Which always blew my mind. I remember they're like, it's rendering text, how hard could it be?

And then like, you really look under the hood and there's like basically a video game engine in there around like collision detection and all this other crazy stuff. So it makes sense once you scratch the surface, but wow.

Heff: That does remind me though, Shaka has, this is getting pretty technical, I think, but like Shaka has an interesting way, I think of handling text tracks in the absence of a remove text track API and that like other players just like deal with the fact that there's like, once you create a text track, you can't remove them.

Whereas I think in Shaka, like you found a nice way to kind of juggle that, reuse them. Is that right?

Joey: Yeah, yeah. So there's two different ways to display text by default, but it's a plugin interface so you can add your own. But one of them uses the text track interface.

And just like we take dash and HLS, we boil it down to an internal sort of intermediate representation that has all the things from both. We do the same with text.

So we'll parse VTT, we'll parse TTML, we'll parse, oh, I can't even remember, Alvaro has added so many subtitle formats now that I had no involvement in, but they all boil down to the same intermediate internal representation.

And then if you are displaying through the text track interface, those all get down converted further into the VTTQ API, which is limited and the implementations of it are even more limited than the spec because even Chrome doesn't implement everything that's in VTTQ.

But when we're doing that, the player will basically create a single text track. And if you switch text tracks at the high level of the player, that underlying HTML text track is just getting cleared and reused.

And when it starts up, if you're running like player instance after player instance, they're each picking up the same track object on that video element. If you're reusing the video element, you're reusing that text track.

So we just don't have a problem with that. And if we find other older text tracks on that video element that somebody else created, we just disable them. So it's only the ID on it that says like Shaka Player that we like, oh, that's ours. We control that.

Matt: Speaking of text earlier, you all have done a ton of translation work within Shaka. What is your favorite translation?

Joey: Well, I think that's obviously the UI translation into ancient Elvish.

So somebody's asked me before like what the story is with the one Star Trek clip that's on there. So I'll do that first 'cause there's a lead in here.

But at the time we started the Shaka Player project, I couldn't find any multilingual test content, like specifically audio. But I had lived in Germany and I owned a region two DVD of Star Trek. And it had all the like e-figs audio tracks.

And so I said, okay, let me just see if I can figure out what fair use means. And I will take this SD 60 second clip in all the languages and we'll just add that to our test content and hope that nobody paying attention to this is a lawyer.

So we created this test clip with Star Trek. And for me, I'm a giant Trekkie, but then the project grows, the team grows. And at some point, one of my teammates was like, how come everything you're doing is Star Trek? What about my fandoms?

And she was the one who was really designing the UI library and working on all the UX stuff. And so when we had to start, we didn't have to think about internationalization when Shaka was just an API, but now we had our own UI, we had our own texts showing up in that UI and even the screen reader text even had to be translated.

So as an Easter egg, we had this available, I believe when we launched the UI in 2018 was the Sindarin translation. It wasn't originally in the repo. Initially, it was only like secretly inserted into the app spot deployment so that nobody knew it was there.

But if you typed in the language code SJN, you would get the UI translated into Sindarin. That is actually the language code for Elvish that has been set aside as like an ISO language code for that.

Heff: Oh my God.

Phil: Is that BCP 47 compliant?

Joey: Yes, it is.

Phil: Excellent.

Joey: So yeah, as part of the process of like getting rid of Google Inside Baseball for Shaka Player, we put everything in the repo, including all the Easter eggs.

And I just recently had to go through an update because we've added a lot of things to the UI. So I had to go update all of our Sindarin translations. But basically there's a web font that loads on demand whenever that Unicode range gets hit.

And there's like an actual Elvish font. So if you're not a Tolkien nerd, the Elvish language, there was like ancient Elvish and then there was like everyday walking around modern Elvish at the time that the stories take place.

And then there's Tengwar, which is the writing system. The writing system is phonetic. You can write English in Tengwar. It's totally divorced from the actual language.

So I could have just taken those English strings and rendered them in the Tengwar font. And I did not do that. I actually spent time not being a speaker of Elvish, going through finding internet resources, online dictionaries, grammar guides, and doing my level best to actually translate these things.

And where I've made mistakes in the Elvish, I'm very happy to have pull requests.

Heff: The commitment here is amazing.

Joey: So it was very hard for me to keep track of all this.

At one point I had a spreadsheet and then I couldn't get the fonts to render in the spreadsheet, but I eventually ended up putting an extra file in the repo that's next to the actual translation file that's much broader and has the original language, the original English string, then a literal translation of that, the words I could find in Elvish, and then those Elvish words in Roman letters, and then those in the actual Unicode range for the Tengwar script.

And so my favorite translation, someone asked me this week, what's your favorite translation? I said, well, it's the skip add button, which literally says, jump over request for money.

So yeah, I got to do a lot of creative translating. I'm looking at the source here. Airplay is another fun one. It literally says, heavens make play. It's the best we could do.

So yeah, you can go to the Shaka demo today and go to the config, pull the config out, and that little drawer, go to UI language and type in SJN, and then, you know, I don't think there's any Elvish screen readers, but even those get translated, so.

Heff: Wow, amazing, fantastic.

Matt: So you asked in there if anybody listening maybe are fluent in Elvish, they could contribute changes.Tell us more about getting onto the contribution train.

Joey: Okay, so there's a very complicated set of command line tools and emails that you have to use.

No, we take pull requests on GitHub. It is a relatively straightforward process. You know, we're not strict about file an issue before you send a pull request, although if your pull request is going to be complex, maybe have a conversation with us before you like do some big architecture.

But we don't have strict rules about that. I know some people like, they like to file an issue and then immediately file a PR to close it. That's cool, we love that too. But yeah, just send us pull requests. We like those.

Matt: Any, I mean, do you all do, I know some Google projects have to do like the ownership stuff, I'm just curious.

Joey: Yeah, so yeah, we do have, it is Google policy that we have a CLA.

There are conscientious objectors in the community who will file issues with like little snippets of code and then refuse to send PRs because they don't want to sign a CLA.

And I'm not going to fight anybody on that if you don't want to sign this legal document that is totally between you and Google. It's not my policy, it's Google's policy, so.

But yeah, you do have to sign a CLA technically and the other maintainers do tend to check. So, but there's actually a robot like a CI action that comes along and says, "Hey, I noticed you haven't signed the CLA." So they make it really hard for us to not notice.

Matt: We're coming up on time here, but anything else you wanted to cover?

Joey: No, not really. I'm really grateful to be part of this community and I'm really grateful to be involved in Shaka all these years.

I want to keep it going, I want to keep the community going, I want to grow the community aspect as much as possible. And yeah, happy to have everybody involved who wants to be involved.

Matt: Awesome, well, Joey, thank you so much for joining us today, it's been a pleasure.

Joey: Thanks for having me.