The Changelog: Software Development, Open Source - Winamp2 JS (Interview)

Episode Date: April 6, 2018

Jordan Eldredge joined the show to talk with us about Winamp2-js — a reimplementation of Winamp 2.9 in HTML5 and Javascript. For many of our listeners, talking about Winamp may bring to mind some ex...treme nostalgia about the internet of the past ... and it's certainly that way for Jerod and I. Jordan started this project in 2014 and it's what ultimately got the attention of some folks at Facebook, where he now works on Nuclide. We shared stories about Winamp back in the day, actually listening to music as an mp3, the technical hurdles and learning Jordan has experienced, skinning it, playlists, making it a frontend for Spotify -- which is so ironic to actually say. Also, Jerod has been hacking it via livestream on Twitch to add it as an alternate audio player on Changelog.com.

Transcript
Discussion (0)
Starting point is 00:00:00 Bandwidth for Changelog is provided by Fastly. Learn more at fastly.com. We move fast and fix things here at Changelog because of Rollbar. Check them out at rollbar.com. And we're hosted on Linode servers. Head to linode.com slash changelog. This episode is brought to you by Rollbar. Move fast and fix things. Resolve errors in minutes and deploy with confidence. Head to rollbar.com slash changelog, request a demo, get started today.
Starting point is 00:00:28 It's loved by developers, trusted by enterprises, and most of all, we use it here at Changelog. Move fast and fix things with Rollbar. Once again, rollbar.com slash changelog. All right, welcome back, everybody. This is the ChangeLog, a podcast featuring the hackers, leaders, and innovators of open source. I'm Adam Stachowiak, editor-in-chief of ChangeLog. In this episode, Jared and I talk with Jordan Eldridge about Winamp 2.js, a reimplementation of Winamp 2.9 in HTML5 and JavaScript. For many of our listeners, talking about Winamp may bring to mind some extreme nostalgia about the internet of the past. And honestly, it's the same way for Jared and I.
Starting point is 00:01:16 Jordan started this project in 2014, and it's what ultimately got the attention of some folks at Facebook where he now works on New Clyde. We shared stories about Winamp back in the day for all of us, where he now works on New Clyde. We shared stories about Winamp back in the day for all of us, actually listening to music as an MP3, the technical hurdles and learning Jordan has experienced, skinning it, adding playlists, making it a front end for Spotify, which is so ironic to actually say. Also, Jared has been hacking on it via live stream on Twitch, so check the show notes for that link. And little did Jared and I know, but Jordan was a big fan of the show, which you'll learn about at the end of the show. I think the best place to actually start is by talking about this tweet that you put out
Starting point is 00:02:01 first year. And it was like, I don't know, it was huge, right? Like it was 3000 retweets or something. It was crazy. Well, that might be hyperbolic, but it was definitely popular. But that wasn't the first time to the rodeo. That was like, there was Reddit,
Starting point is 00:02:14 there was Hacker News, there was other stuff. And the thing we're talking about is called Winamp2.js. You can find it at webamp.com. Is it.com? It's not.org. Webamp.org. Let me share some coverage here because I was actually looking this up You can find it at webamp.org. Let me share some coverage here because I was actually looking this up as I was live streaming the other day, hacking on this WebAmp 2.js.
Starting point is 00:02:33 In the readme, Jordan has press coverage, and he's been covered by TechCrunch, Gizmodo, Motherboard, the changelog, which is in a different section but i understand and i was looking at the different dates and i was thinking do we scoop these guys so i looked at uh motherboard they they covered it in like february this year we scooped them i was looking at tech crunch it was like right after you know they saw motherboard posted basically and they covered it and that was like february you know, they saw Motherboard posted basically. And they covered it. And that was like February this year.
Starting point is 00:03:06 We scooped them. And I was starting to feel pretty good about myself. And then I went to Gizmodo's coverage of WinAM2.js. And it was like February, I don't know the month, but it was 2014. 2014. So props to Gizmodo for scooping this project up years ago. And I guess that helps us kind of date how long it's been around and how long you've been working on this. So tell us a little bit of the story. You know, it's four years later. What was this idea and
Starting point is 00:03:35 what were you doing back in 2014? Yeah, it's a funny backstory. So I was sitting in my room, just I don't have any idea what I was doing, but the memory of Winamp skins came back to me. And I guess for anyone who doesn't remember, Winamp skins was the way that you could theme Winamp. And the implementation of it was just a zip file that contained bitmap files, which were sprite sheets. And I guess at work, I had been doing some stuff with CSS sprite sheets. And suddenly this parallel kind of popped into my head that like, whoa, Winamp skins were sprite sheets. And I'm used to doing sprite sheets and I'm used to doing sprite sheets in CSS now. I wonder if you could sort of reconstruct the Winamp UI, uh, using CSS. And so I was like, Oh, that sounds really fun. So I sat down at my computer and, uh, tried to, you know, pull up some BMPs, realize that, Hey, browsers can still play or still show Bmps just like any other image uh and yeah
Starting point is 00:04:46 you could do it and bmp uh bitmap it's like a very primitive non-compressed uh image format yeah no transparency in bitmaps um but yeah so that that first little bit worked. And I was like, wow, that's pretty cool. And then I was like, well, how do you connect up the audio? And so I went and learned about Web Audio API stuff. And I got the main window. So it's like Winamp is broken up into three different windows. There's a main window, which has like play and volume and a little visualizer on there. And then there's a equalizer window and then there's
Starting point is 00:05:26 a playlist window, but I got just the first one working and I tweeted about it. Um, cause I thought, you know, Hey, maybe my friend Jake would think this is cool. Um, and yeah, it kind of blew up, um, back, you know, back then was that 2014. Uh, and, uh, I think it, that's, I think when you were saying gizmodo picked it up made it to news and you know that's like a exactly yeah it's like a uh someone who was i guess fairly new to sort of the mainstream tech industry uh that was like i don't know i was like over the moon that all these you know that i got sure posted to Hacker News and it was kind of unbelievable. And I guess maybe just that, that interest was like, well, I guess I'll keep working on this. And then, you know, four years later, I guess I haven't really ever thought to question whether I should stop.
Starting point is 00:06:17 How much time do you have into this? It's a good question. So it's a long-term project but it sort of goes in phases where I come back to it and work on it and then sort of walk away for a while. I'm a person who likes to have a lot of different projects going in parallel so that when I get blocked on one, rather than sort of being forced to solve a problem in an imperfect way, I can just sort of walk away until, you know, sometime in a shower, two months later, I'm like, Oh, Oh, that's how I could do it. And then, you know, I can come back to the project. So I really have no idea, but I, you know, probably often we'll spend, you know, three or four hours a week or, or more, you know, and on busy times when I'm really feeling it probably a lot more than that. Reminds me of a tweet I saw recently where it was a cartoon and we retweeted it. So if you follow us on Twitter, you'll see this, but it was a cartoon.
Starting point is 00:07:12 It was a brain and saying, Hey, to the person who owns the brain, essentially, Hey, you're going to go to sleep. And then the next pane, it says, yes, now shut up. The person talking to the brain and the brain says, I think I figured out how to debug your program. And then suddenly the next one is the eyes wide open. It's like, you know, just you're up now. You got to go to work. So, you know, it's nice to have those side projects where you can sort of like step away and do something different.
Starting point is 00:07:38 In this case, it's sleep. But you get the point. Take a shower? Yeah, take a shower. I like that. You know, it's got to give yourself room. And that's an interesting. You. Take a shower? Yeah, take a shower. I like that. You know, it's, you gotta give yourself room and that's an interesting.
Starting point is 00:07:49 You like taking showers? What do you say? Well, I think it's an interesting perspective to have a reason to have many projects ongoing so that you can break from one on blocks and still have fun and enjoy, you know, your craft, but not get stuck and be like
Starting point is 00:08:04 pulling your hair out. And I think that's another big advantage of side projects is that they enable you to work in that way where rather than, you know, being forced to solve a problem, if you don't have a good solution, you can just say, oh, okay, you know, putting that one on hold. Um, and you know, either, either I'll decide that it's important to come back and hack something in and move forward with something imperfect, or hey, I'll just sit it on the back burner and let it stew for a while. Whereas in work, you've got to ship, otherwise you're not going to get your paycheck.
Starting point is 00:08:39 So there's kind of two kinds of people and and probably a uh a sliding scale between them you have people with a bunch of ideas and no time to do them or maybe just enough time to work on one or two and then you have people with a lot of time and no ideas and then like i said there's a sliding scale but uh jordan you seem like kind of guy who's got lots of ideas and you also execute on some of them at least we've seen whenamp 2 will also probably get around to talking about URL.me which is cool as well. Where do your ideas come from and can you give somebody advice? I can't think of a cool side project.
Starting point is 00:09:15 How do you initiate a cool side project? It's really funny because I spent a lot of time feeling like I was in that first camp where I had all this time and like, I really wanted to be doing something cool, um, or to be like participating, but I didn't feel like I had any ideas. And I think as you pointed out, you know, now I'm sort of transitioned into this other situation where I've got, you know, more things that I want to do than I have time in which to do them. And I was looking back at, you know, all these projects that I've done, and I'm definitely like a side project kind of oriented person. And I realized that the one
Starting point is 00:09:54 like theme throughout them is trying to do something in a medium in which that thing is surprising. So with like Winamp 2.jsamp2.js, I think it's somewhat surprising that you can do as much as you can, that you can re-implement to the level of detail that is possible inside of the browser, which is a pretty tight constraint. And with URL meme, which you said we might get into later, which is like a meme generator where the URL is the user interface,
Starting point is 00:10:23 so you should be able to generate a sort of, you know, a quote unquote meme image by just typing a URL. You know, it's again, like, I think a surprising thing that you could actually do that. And looking back at all my projects, I think that's sort of the recurring theme. And the inspiration then I think ends up coming from understanding the technology and thinking about the things, you know, learning about the features of the technology and then those ideas sort of bubbling around in your brain and overlapping with other things that you've come across in your life. So, you know, this example of, uh, when I'm being inspired really by this idea of CSS sprite sheets overlapping with my memory of, uh, you know, hacking on Winamp skins as a teenager. Um, so I think, you know, I wish I had like a direct, like go do this thing and you will have great ideas. Um, but I think really it was when I started having a deeper understanding of technology and exploring sort of the edges of obscure APIs and things like that that these ideas started coming to me more regularly.
Starting point is 00:11:35 Yeah. and discuss what makes something interesting or what makes it popular or what resonates with developers because those are things that I think intellectually stimulate us. And obviously we're in the arena of covering those kind of things and talking about them. And Winamp2.js specifically had two things going toward it. The first was an extreme amount of nostalgia that it invokes to most people who were around either, I guess,
Starting point is 00:12:12 in the formative years or older in the late 90s, early 2000s when it was very popular. And then secondly, this little bit of a surprise factor that impresses you that you can actually do this in the browser. this little bit of a surprise factor that impresses you that you can actually do this in the browser. It has those two aspects to it,
Starting point is 00:12:30 which makes it very I don't want to say necessarily viral. I guess it has waves of coverage and has resonated with so many people. It's sticky. Thank you. It's sticky. You turn back somebody's time a little bit, especially somebody who's sticky. I mean, like, you go back, you turn back somebody's time a little bit,
Starting point is 00:12:47 especially somebody who's actually used this to play music, not just look at it as this thing here, which is cool, of course, but somebody who's used it and managed playlists and, you know, fine-tuned the EQ to their favorite rock song or whatever. Like, you know, you kind of bring out this inner child, you know, this childlike joy that we don't often get to face because, you know, you're stuck on a block and you don't get enough side projects or you got to ship because you got to get a paycheck, as you said earlier. Like you give that back and then you're like, oh, then go one step further and dig a little further into this open source code base that if you want to learn something, hey, this is how you learned it. Yeah, I think the nostalgia angle is really huge. And I think, you know, if I have any advice for like how to come up with a side project that is going to generate interest, it's, you know, ride somebody else's coattails as far as possible.
Starting point is 00:13:34 Because really, that's, you know, that's what it is. You know, this thing has gotten, you know, like posted in a bunch of places with, you know, comments. And every time I read through the comments, you know, maybe 5% are actually about the project and the rest of the comments like, oh man, Winamp, uh, you know, I still use Winamp or Winamp was the best and everything, you know, more recent is garbage. Um, but that, and I think, you know, the same, that was the same impetus for me doing it was I have, like you said, this sort of emotional memory of this MP3 player from a time that was formative for me, both as a person, right? Like music as a teenager, which I think is probably the people with whom this is resonating the best. Um, you know, the way that you consume music as a teenager has got to make an imprint on you because music is so important, I think as a, in your, in your teenage and college
Starting point is 00:14:31 years. Um, and so I think much in the same way that that's what has maybe driven the interest in this. It was also what drove my own personal interest in it, um, was, you know, wanting to recreate those experiences. In fact, um, you know, I said that the original idea came from Winamp skins. And that was actually, I think the first like constructive thing I ever did on a computer, you know, where I went from a consumer of software to, you know, creating something from nothing, uh, which is, I think a really powerful moment for any, I probably almost any programmer can remember that first moment when you like sat down at a computer and then sometime later, a thing existed that didn't exist before only out of, you know, your time and your brain. Uh, there were no, you know, you didn't have to go to the
Starting point is 00:15:25 store and buy parts. Um, it was just your idea made something new in the world. And that experience, I think, even though, you know, there were, I was making the world's ugliest wind amp skin that never saw the light of day and nor should it have. Um, but, but I think that was really informative and I see a direct line, that experience through to writing software today. And the experience of working on Winamp 2.js definitely feels like that same kind of joy of sitting down at a computer and making something that didn't exist before exist just from your own, you know, time and, and mental energy. Yeah. Well, Winamp definitely has the same warm, fuzzy feelings for me as well. I didn't take it as far as you, I didn't actually create skins, but I do remember this was like specifically for me is attached to Napster and the timeline in terms of like what was happening at the same time.
Starting point is 00:16:22 And it was like, you're waiting for your files to download, right? And they were taking forever because the internet was slow back then. And while you do that, what do you do? Well, I'm just out there downloading WinAMP skins and swapping them out and creating playlists and just wasting hours upon hours. And I never quite made it across the void like you did to like, I'm going to create my own. But it definitely had, you know,
Starting point is 00:16:45 down the road, I had times where I peeled back the covers and saw the power of programming. Adam, were you a Winamp user back in the, back in the day? I was. And actually your story reminded me when it talks about skinning was skinning forums. That was a huge thing. I can't remember the most well-known forum. Maybe you all might remember the brand name of it but it was the most used and skinning those and skinny win amp was like the coolest thing and yeah i was never cool enough to do either yeah i totally remember having these like you know downloading these these skins and uh and just being like, oh, my God, the people who made these must be like, you know, the most massive, you know, kings among men. And, you know, through this project,
Starting point is 00:17:45 end up connecting up with a couple of people who were, you know, sort of big time skinners back in the day and had made some of these very cool skins. Um, and it's really funny, you know, having a little bit more perspective in life, uh, getting to, to talk to those people. And, you know, certainly the work that they did was really incredible, but I, you know, the outsized presence that those people had in my mind as a teenager is really funny to look back on, you know, these days. Someone out there is screaming VB Bulletin because that's what it was called. VB Bulletin. Or VBulletin, I guess, is probably.
Starting point is 00:18:21 And not VB. VBulletin. Was that a specific website or was that just the forum software that that's the forum software i think that was like the most popular and a couple others that i recall but yeah envision i think might have been the other one phpbb what year did that come out that's the one i was thinking of phpbb i was thinking of vision and then v bulletin and yeah phpb as well that was in the mix too but yeah you'd hang out on these forums. You'd find people to connect with.
Starting point is 00:18:48 Like this is the old days of the internet. And like you would, I guess you still do that, but like that was the only way then. That was pre-blogs where it was like on the cusp of blogs. Right. And it was totally in the era of like Napster
Starting point is 00:19:00 and downloading music when it was, you know, you did it not because you wanted to steal. You did it because it was new. You know, it was, I never, I don't music when it was, you know, you did it not because you wanted to steal. You did it because it was new. You know, it was, I never, I don't, maybe I was, I was probably poor then too, but so I probably had to, I couldn't afford it, but I don't think I did it because it was like, I want to steal your stuff.
Starting point is 00:19:16 It was more like, that's how you do it now, I guess. I mean, it's the world's changing. I don't know. MP3s, give it to me. That's changing. I don't know. MP3s, give it to me. That's right. Yeah, I think it's hard to untangle the experience of Winamp from the experience of digital media, digital audio being available for the very first time and sort of just skyrocketing into the mainstream, uh, and, you know, suddenly this huge availability of, of music and the ability to just ingest, you know, music from all over with very little friction. Um, I think, I think everybody who went from, you know, through that transition from, oh, you only get music at a CD store when you can drop, you know, 10, 15 bucks on a CD to, uh, you know, Oh, everything
Starting point is 00:20:07 is suddenly available to me at my fingertips. And I think that feeling is probably very, it's probably a very important, potent part of the emotional reaction that people have to win. I would guess. And not just music that you could buy at the CD store. Is that a thing? When you said CD store, I was like, CD store? That's interesting. What is that called? Music store.
Starting point is 00:20:31 Music store. A record store? A record store. Yeah, it has been a while. You should label it by the media type. CD store. We used to go to the MP3 store. But actually new music, things that didn't exist outside of the digital, right?
Starting point is 00:20:48 Like the covers and the remixes and these, like, the MIDI stuff. There was so much new. Yeah, bootlegs. But one thing I want to ask both you guys, I guess, open question, because as developers, even asking Jordan, like, what's something that, you know, what's some secrets to creating something that will resonate with the community? Thinking about Winamp, in this case, you're tapping into the love of Winamp to a certain degree. But if we're thinking about Winamp as a software product and what people loved about it, we want to create things that people love, right? That gives them value and joy. Are there lessons we can learn aside from the one that it's attached to music and that was also formative and important to people? What was it about Winamp that we all loved about it?
Starting point is 00:21:35 Was it the customizability? Was it the interface? What do you guys think? Right time, right place. That's all? I mean, it was cool, but what else competed like you might have had like windows media player maybe yeah you know like there was nothing that was like that was catchy sticky that allowed you to like uh jordan said earlier become the creator you know come something
Starting point is 00:21:57 from nothing that didn't i don't think windows wanted you to change their media player so that might have been the customizability of it and the timing i i think you know you're you're you're kind of spot on with the timing but i think there's another aspect to it as well um which is that it was a little bit punk uh i think at that time the um the mp3 algorithm was still like under, like, you know, you couldn't use it without a license. That's right, yeah. And then somebody like leaked it or something like that. I don't, someone probably knows the story better than I do, but there was the Fraunhofer Institute or whatever. Somebody like leaked the source to an MP3 decoder engine,
Starting point is 00:22:45 and suddenly it basically became possible for anyone to integrate it. And I don't know what the legal implications of that were, but I think basically that patent suddenly became indefensible. And so I think Winamp was one of the first to jump on that and be like, no, we're shipping this inside you know, inside free software. I guess that's another thing that's a big piece of it is that it was, you know, shareware or freeware or whatever, which I think was also, you know, another thing of that time.
Starting point is 00:23:16 Yeah, it didn't cost you anything. Exactly. And it had to catch its song, or not the song, the tagline. I mean, that does play into the punk, or at least it had attitude, right? Yeah, and I think a lot of that's attributed back to, you know, sort of the main guy, Justin Frankel, who created it. And, you know, maybe your listeners know sort of the story of him that after he sold Winamp, or I guess he and Nullsoft sold Winamp to AOL, there were a number of
Starting point is 00:23:47 stories about his behavior within AOL because he was, you know, then on, on contracted to, you know, or to, to stay on the project for some number of years. But he did not fit in at AOL at all. And so he was like releasing peer-to-peer file sharing software, like on AOL's website against his boss's wishes and a bunch of other stuff after they paid him millions and millions of dollars payday. Yeah, so according to the history books,
Starting point is 00:24:15 they sold it to AOL in 1999 for $80 million. And the nostalgia for Winamp 2 specifically, because you didn't build Winamp 3.js or Winamp 5.js, even though these things exist, is that once AOL took it over, it lost a lot of the things that people loved.
Starting point is 00:24:32 There's a major rewrite, new UI. It was very AOL, which is like anti-punk, right? It's like the most mainstream thing, company at the time. And so another reason why I'm thinking why it's so nostalgic is because it reminds us of a better piece of software
Starting point is 00:24:50 than, you know, currently exists and kind of like the glory days. Yeah. Well, you know, it was fast. And I think we have a lot of, maybe as a JavaScript developer and, you know, I feel this a little bit,
Starting point is 00:25:03 you know, more cutting than others, but, you know i feel this a little bit you know more cutting than others but you know this sort of uh rebelling against you know modern high-level languages which you know are comparatively slow and resource heavy uh you know hey it was it was fast and it was you know graphically beautiful or i guess depending on your aesthetic tastes. But yeah, I think the fact that it was a singular vision from a very singular person, I think, and then it was just well executed on top of that. And it wasn't compromised into any kind of corporate requirement. It was like this was the thing that Justin wanted to build.
Starting point is 00:25:44 And that, I think, has a lot of power. This episode is brought to you by Linode, our cloud server of choice. It's so easy to get started. Head to linode.com slash changelog. Pick a plan, pick a distro, and pick a location, and in minutes, deploy your Linode cloud server. They have drool-worthy hardware, native SSD cloud storage, 40 gigabit network, Intel E5 processors, simple, easy control panel, 99.9% uptime guarantee. We are never down. 24-7 customer support, 10 data centers, 3 regions, anywhere in the world they got you covered.
Starting point is 00:26:36 Head to leno.com slash changelog to get $20 in hosting credit. That's 4 months free. Once again, leno.com slash changelog. So, Jordan, you've been working on this off and on for four plus years. Surely it's taken different forms. I notice now it's built with React and Redux. Those things didn't exist in 2014. So take us through some of the history of the software itself, maybe some technical hurdles or interesting bits, and we can talk about all that's packed into Winamp2.js.
Starting point is 00:27:26 Yeah, yeah. So originally it was written in jQuery and I think it didn't last very long in that form. But I honestly didn't know JavaScript at all when I started the project. Like I was trying to figure out like how do you make a class, which of course is not a thing, or how do you split this across multiple files? Were you used to coding at the time? I was just writing bad PHP and bad jQuery, stitching together plugins and whatnot. And it was really this project that taught me JavaScript. I was curious about it, so I'd come home each night eager to try to make it better. whatnot. Um, and it was really this project that taught me JavaScript. Uh, you know, I, I was curious about it. So I'd come home each night eager to try to make it better.
Starting point is 00:28:14 And as part of that, I ran up against my own, you know, limitations of knowledge. And so, you know, I kept having to learn like, okay, how do you actually, you know, like I said, do make a class or learn about prototypical inheritance and whatnot. And so I wrote it all in jQuery at first. It was very primitive at that point. It didn't do very much. And then pretty quickly, I realized that this wasn't really the right way to go about it. And so I rewrote it all in just what we call vanilla JavaScript without any framework at all. And it existed in that form for quite a while until I then I started to run up against limitations of that. And having learned a little bit about React at that point, I realized that this sort of declarative nature of being able
Starting point is 00:28:57 to rather than managing transition between states, just managing state and then, you know, a projection of that state into DOM state seemed like it made the right, made sense for this problem. Were those the bumps that you were hitting with the vanilla JS version? If you recall back then, like what were the particular aspects? Was it just like crazy amounts of state everywhere and you having to react to it or gosh yes i think that yeah i think the main uh the main thing is when you don't have this declarative um you know sort of react model of your ui being a function of your state you end up managing the transition between every state and so then you get this like your um you know your the complexity of your application
Starting point is 00:29:54 is exponential of the number of states that you have because you have to manage the transition between all of you know any two states have to be able to go between them. And so I was running into that with, you know, as I was adding more and more detail, the pain of maintaining that just, you know, was rapidly exploding. And so I felt a switch was necessary. And so, yeah, I switched to React and Redux. And, yeah, I think from there, you know, it was a pretty good fit for that, uh, for that model. Uh, but the, I think the real technical limitations were, were not, you know, like in the framework decision, but in the, you know, some of these, like I, you know, I think I said earlier about trying to do things which are surprising in a medium. So like, can you do the things that you can do in JavaScript that you might not think you could do? And some of those technical challenges, I think were a little bit more interesting. I think the most interesting one is, you know, Winamp2.js actually loads actual skin
Starting point is 00:30:57 files. And getting to do that inside the browser posed a bunch of interesting technical challenges. And I could go into that or not. But I think those kinds of problems were much more sort of interesting than what framework to use. Yeah, and that was a surprise to me. I assumed it was just going to be looking like Winamp and like the play button works and all that. But the fact that you can click the upper left-hand corner and swap skins was awesome.
Starting point is 00:31:30 And then when I actually cloned the code down because I was dorking around with it and I saw, no, these are actually just skin. This is not some sort of like, he didn't remake these skins. These are the actual, can you go download off of Adam's old V-Bolton forums, can you go download an old skin and pop it into WinAMP 2.js and it'll work?
Starting point is 00:31:51 Yeah, you can just drag it from your desktop right on top of it and it'll change. Uh-uh. That's not cool. That's what I say when I'm in complete disbelief. Uh-uh. You can do that. Yeah, yeah. It's a bunch of, it's hacks on top of hacks to get it to work inside the browser.
Starting point is 00:32:10 But yeah, I think once I realized that, you know, Winamp skins were just zip files of, you know, bitmaps and someone has written a, you know, JavaScript zip utility, it's like, well, okay, you can do it i guess so it unzips them and how does it work i mean yeah yeah so um some hacks the the you know the first step is right of course unzipping this you know binary blob and then you get access to these bitmap files um and then, of course, you need to treat those.
Starting point is 00:32:47 Those bitmap files can't just be used directly because those are sprites. And anyone who's done stuff with sprites might know that one of the limitations of sprites is that you can't do repeating tiles using sprites very easily because you'll end up repeating the whole sprite sheet. So we end up extracting the zip file, getting the sprite sheets out of the zip file, rendering those into a canvas, slicing the individual sprites out of that canvas into a data URI. And then given those data URIs, well, you might think,
Starting point is 00:33:23 oh, I can just set these as like background images on, you know, using JavaScript. But in many cases, you have to apply them to like pseudo elements. So like the hover state of an item or the like handle of a slider. And there's no way to do that from JavaScript. So what it ends up being is we get these data URIs and then we dynamically generate a CSS style sheet and then inject that into the DOM. So none of those things are particularly beautiful, but it does work. It does work. Which with a side project, it does work. It's pretty much what you're after, right?
Starting point is 00:34:04 Yeah, exactly. And I think actually the thing that was most interesting about it was not only does it work, but I feel pretty confident that even though it's not the right, it doesn't feel like a clean solution. It is the only solution. solution and and i think having a an excuse to do something terrible um where you're still doing the right thing is uh i think that's i think you know when i know i'm having fun so when you drop the the w whatever file wsz while you guys talking, I was hacking on some fun stuff here. Is it actually uploaded into your UI and then like deep pack? Cause it happened pretty quickly. I drug one on there and it, it changed it in real fast. Yeah.
Starting point is 00:34:54 So the, I think one of the limitations I set for myself for this project is there's no server component, right? So it's just JavaScript. So everything happens inside your browser. So it's, it's it, you know, when you add the file, when you drag the file in, I get access to, you know, a reference to that file and I can get access to the bits in that file.
Starting point is 00:35:16 And so, you know, it all goes from there inside your browser. Wow. Well, that was something you brought up actually in your Twitch live stream yesterday and i was thinking like that would be super cool and then i was thinking where do you even begin i don't know 1997 i think is where you gotta start yeah you gotta go back in time where do you begin jordan yeah i mean uh i guess if you want to make a skin all you really need to do i guess what you do is you go google Skinners Atlas, which was in 1998, sort of the canonical reference for how to write Winamp skins. And actually was a huge, was hugely valuable to me trying to reimplement all this stuff. Because I not only do I have to, I have to really fundamentally know how these skins get used in order to recreate the Winamp UI, you know, to a high degree of detail.
Starting point is 00:36:12 Yeah, and it's a bunch of bitmap files in a zip that's been renamed. And then there's a number of like config files in there as well. So some INI files and whatnot, which of course I also have to parse. Tangential, of course, but in this journey of yours, having to go to all these obscure, you know, to some degree, you know, kind of older websites that have information that not a lot of people are actually looking for anymore.
Starting point is 00:36:33 You got to deal with all these ads everywhere and this weird old school web too. Or maybe kind of new school. There's ads everywhere now. It's just like, is that a download skin button or is that an ad? Right. Yeah. Both. there's like this it has been an interesting experience with sort of understanding bit rot you
Starting point is 00:36:50 know and how you know these things that we sort of took for granted being around are not necessarily going to be around forever unless someone cares um and uh you know as part of that i actually uh this actually goes a little bit into one of the things that spun out of this project. Someone suggested I write a Twitter bot which tweets out Winamp skins. So if you go to twitter.com slash Winamp skins, I have a little bot there which once or twice a day'll tweet out a screenshot of a Winamp skin and a link to, uh, webamp.org with that skin turned on. Uh, but just as an, as an effort to sort of preserve some of these, uh, you know, these things that people put a huge amount of effort into and are really, uh, you know, iconic of that era. And sometimes it's because they're just like really
Starting point is 00:37:44 incredible and the craftsmanship that went into them and whatnot. And sometimes it's because they're just like really incredible and the craftsmanship that went into them and whatnot. But sometimes it's because they're, they're pretty atrocious and you're like, why is there a worm, you know, protruding from your MP3 player? That's a little bit strange, but it's impressive, I guess. Um, so yeah, I think, you know, I certainly didn't set out on this project with any kind of noble ambition. But I think in retrospect, if there is anything really valuable that has come out of it, it's that it does provide a way to take these artistic artifacts, which were becoming increasingly hard to share or to experience,, you know, sort of, you know, lower the barrier to entry there. And in fact, I've been, I've been reached out, I've reached out to some folks at the internet archive and looking into, you know, maybe ways that we could, you know, have a
Starting point is 00:38:37 collection of Winamp skins up there on the internet archive. That's a great idea did they yeah i think i tweeted something and uh a friend of mine uh tagged somebody else who i guess works there as a volunteer there and was like yes give me all of them in any format so i i still have to follow up with him and figure out exactly what uh you know what we can do and whether we i think my main goal goal would be if we could get a great UI for experiencing them and integrate it with WinAMP 2.js. But I don't know whether that's more than they want to take on. It looks like you can actually, by checking out your tweets,
Starting point is 00:39:17 it looks like you can actually inject a skin via URL. Yeah, if you pass a sort of carefully crafted um json uh in the in the hash of the url you can inject either an mp3 or a skin now mp3s and skins are both a little tricky because uh cross origin headers and whatnot uh so i i haven't exposed that's something that a lot of users have asked for is this ability to, you know, and in fact, Winamp itself could do this. You could paste in a URL and it would play it for you.
Starting point is 00:39:52 But alas, you know, due to the cross-origin restrictions, more often than not, that experience is not going to actually be good for the user. So I've opted to not expose it in the UI. So as part of that, a side effect or a side conversation might be, are you cataloging these things in an S3 bucket or something like that? Or because it looks like it's on Amazon AWS. Is this you kind of collecting these as you tweet these?
Starting point is 00:40:17 Yeah, so I got some huge zip file of many thousands of, um, of MP3 of, of, uh, skins. And I've been sort of reviewing them and, uh, you know, looking through them and picking ones that I thought were, you know, notable, I guess. Uh, so I mean, Pac-Man fever fever that was super cool march 10th that's notable so i there are definitely like i try to pick ones which are which are either interesting which are interesting not necessarily because they're great but because they are interesting so i try to include the ones that are you know great and also the ones that are surprisingly not great but yeah then i I just push them up to S3 because they do have to be available somewhere and that's a pretty
Starting point is 00:41:09 fast server and it's for me to host them there. And then somebody's not going to change the URL contents for you like you're pointing to something. Oh let me just change out this image for something malicious or just whatever. Right. Exactly. Yeah. So here's an idea. I'm still stuck on change log skin. So I'm trying to think of ways of getting. Yeah. So here's an idea. I'm still stuck on changelog skin. So I'm trying to think of ways of getting this done. So here's the plan.
Starting point is 00:41:30 So to the listening audience, this episode of the changelog, Jordan has agreed to host it indefinitely at webamp.org, which is his website for WebAmp2JS. Maybe we'll talk about names in a second. Webamp.org slash changelog. We'll link that up in the show notes.
Starting point is 00:41:48 When you go to that page, you can listen to this episode inside Winamp2.js. Now, how cool would it be if somebody, anybody out there, created a changelog skin that we can use on that player? So it's branded. Super cool, right? So if you have skills you have skills you don't have any skills you got time and you want to try this out contact us we would love to
Starting point is 00:42:13 work with you we even have like a bread a brand guideline you could use we have all of our colors our fonts like everything you need and you can just pull all the colors from our stock sheets too on the on the.com. I'm totally on board with this. I think this would be great. Awesome. So that's skins. Let's talk about other features because it's really quite functional.
Starting point is 00:42:38 You can separate the different segments, drag them around separately. You can resize. What all is in here that maybe people don't know? Yeah, I think it's taken on the form of like a puzzle box in that you open it up and it's like, oh, yeah, I can click play. But under the hood, the more you dig, I think the more little details that i guess just bothered me enough that i decided to do them uh will reveal themselves so uh you know the i think the simplest one is just you know you play and there's like a visualizer right so the there's two different kinds of visualizer if you click on it um in the main window it'll go between the sort of like bar
Starting point is 00:43:22 graph visualizer and a line graph visualizer and that's all hooked up through the web audio api um the equalizer works uh so you can uh you can twiddle the different levels of the different frequency bands and again that that works actually pretty simply through the web audio api once you work around a bug that i discovered in safari which depending on how you ordered things in the Web Audio API, it would just like hard crash like segfault Safari. So that took me like three months to figure out. But those are good ones. And then I think the window management has been interesting too.
Starting point is 00:44:00 So, you know, like I said, I released this first version, you know, back in 2014, and it was just the main window at that point. And then going from one window to two windows, suddenly there was a huge amount of additional, like extra layer of work required. So, you know, you can drag these windows around, but they, Winamp had this great feature where, you know, most of the time you probably want them sort of stuck to each other. You want the windows sort of arranged, but you want them to form a single unit. And so it had like snap.
Starting point is 00:44:33 So if you drag two windows close to each other, they'll sort of align directly. So getting that to work was quite a bit of effort. And in fact, just recently, another piece of that is, you know, the windows have this like shade mode where they'll like collapse down to just their title bar. And Winamp, again, has this interesting UI feature where if you have two windows, one on top of the other, and you put the top window into shade mode, all the lower windows will sort of travel along with it and so like getting that to work was another uh bunch of effort um let's see this laundry list of other things it can parse the binary equalizer format files that winamp
Starting point is 00:45:17 can generate and it can also generate them so if you like set the equalizer to a particular level you can export that as a binary file and then like drag it in to to uh bring it back to that level um the playlist works and you can export your current playlist as a html file which again winamp could do um yes this file type eqf it's pretty simple. I had never actually had to do anything with binary file formats, so it was my first entry into that kind of world, which is good. I learned a lot. But it's very simple. It's just a name and then 11 values between, you know, zero and 255.
Starting point is 00:46:10 So why can you save a preset for the equalizer and not the playlists? Is it completely different? Is it like just a JSON? Would you kind of modernize it or would you sort of still go old school with it? So you're saying like why can you save the export of the equalizer, but you can't, like, export your playlist? Yeah, exactly. Which I think Winamp also uses, like, the M3U format. Yeah, it's another thing people have asked for.
Starting point is 00:46:31 And the reason is that there's, like, I don't have direct access to your file system. So if you came back, if you had, you know, dragged in, you know, your Matrix soundtrack to listen to, and then you try to export that playlist and then you and then you load up that playlist again i can't go look on your on your file system and find those files for you um and so like while i could certainly you know read and generate m3u um files i can't go i can't actually do anything useful with them. So it's again one of these limitations of the browser where you can do a lot, but you can't do everything. Now,
Starting point is 00:47:13 maybe my memory isn't serving me, but this snap you mentioned before, when the different panes snap together, that just seems like exactly how Winamp used to work. Is that exactly i mean as much as you can or am i just having like backwards nostalgia where i think this yeah i
Starting point is 00:47:31 mean as much as possible i've tried very carefully to recreate everything exactly and and partially it's just because it's kind of fun to do um but also also, it's actually kind of freeing as an engineer who, you know, even with the most well-defined spec, I think any project ultimately ends up being a lot of judgment calls as an engineer of like, okay, how should this thing actually work to be the best? And there's something kind of liberating about not having to make that decision ever. And just knowing like, okay, the spec is this is this thing right i want it to behave exactly like this for better or for worse um so yeah it's like i was literally you know a slow-mo screen capturing actual winamp in a vm to see how many pixels away it is until it snaps um and yeah and
Starting point is 00:48:21 i guess to say for better or for worse, there are some cases where Winamp has bugs where things don't behave in a quite sensible way. I've actually gone ahead and re-implemented those bugs just because for me that's kind of more interesting than trying to make the best MP3 player just to make the one that already exists. This episode is brought to you by our friends at GoCD. GoCD is an open source continuous delivery server built by ThoughtWorks. Check them out at gocd.org or on GitHub at github.com slash gocd. GoCD provides continuous delivery out of the box with its built-in
Starting point is 00:49:11 pipelines, advanced traceability, and value stream visualization. With GoCD, you can easily model, orchestrate, and visualize complex workflows from end to end with no problem. They support Kubernetes and modern infrastructure with Elastic On-Dand agents and cloud deployments. To learn more about GoCD, visit gocd.org slash changelog. It's free to use and they have professional support and enterprise add-ons available from ThoughtWorks. Once again, gocd.org slash changelog. so i'm thinking about how this works it actually works, not just looks like it works, but it actually works and you've thought through all this cool stuff and even recreated bugs. And I'm thinking like, we're talking about usefulness and exporting playlists and equalization and all
Starting point is 00:50:15 that fun stuff. But like, could this be like a front end to say, Spotify as API, for example? Yeah. There've been a lot of people who, uh, you know, where they pull it up and they're like, Oh my gosh, you can really drag in MP3s. That's so cool. Let me go find an MP3. Oh, yeah. I don't have any. I don't have MP3s anymore. And so there have been a lot of requests for like, OK, how do you take this thing, which is, you know, really just a gimmick, right?
Starting point is 00:50:41 It's a web page. You can go to it and go to it you go oh neat and then you move on with your life um but there have been a number of people who thought like okay how do you turn this into something that's actually you know useful um and so i think the ones that i've seen are like you said the spotify people want it to integrate with spotify um they want it yeah yeah people what okay this isn't just you this is them poaching you all right cool let's hear more no i'm not necessarily spotify wants it but oh okay the people of spotify not spotify the company stepping back so spotify is that like spotify itself actually did uh, a player called spotty amp, which was a like C wind amp clone that you could run on your desktop if you had a Spotify like premium account. Um, and I wish I could remember the name of the
Starting point is 00:51:37 guy who did that because he's a, he's a notable guy. Um, but he was working at Spotify and he built this wind amp clone that you could download and run and it would interact with Spotify. And I think they had first, they had some licensing issues with it. Um, and then I think ultimately there was a whole to do about people were using the, the like, um, library, the underlying library, which that thing used, um, as a a as a hacking monetization model so they were like creating fake spotify accounts and then um they would like hack into arbitrary people's computers and like play tracks on those um spotify author accounts tracks and then make the like revenue from having their tracks listened to a bunch and so eventually spotify had to shut down that um or they chose to i guess shut down that
Starting point is 00:52:31 that thing so yeah spotify itself i think at least some people within spotify would like to see a winamp interface um and you know they do have this api that's available online um and i don't know for sure but i think it might have something to do with the new DRM enabled APIs in the browser. And that's a whole other conversation. But because of the DRM, we can't get direct access to the audio stream. And so there are some features which don't work. So the equalizer can't work cause we can't twiddle the bits in the way that we need to. And the visualizer can't work. Um, and the balance can't work. Um, so for now, and unless maybe the, you know, a bunch of these things get added as, um, you know, on top of the existing
Starting point is 00:53:20 web APIs for now, those things can't work. Someone has a copy working. And once I think that solidifies a little bit, I'll share that. But because it basically can't work fully, I think I'm not going to include it in the core. But today there's Dropbox integration. So you can, if you go to the options menu and you say like open a file or play file,
Starting point is 00:53:43 you can pick from your dropbox folder can you actually put it at a dropbox folder that becomes a playlist yeah you can like there's dropbox has a little like file picker ui and you just pick from there and it will populate your playlist with you know a directory of files wow while you were talking about that too i was also thinking about just like alternate ways to use this could be that would make a really sweet looking iPhone interface or even mobile interface because it's, you know, vertical, you know, and the playlist can be, you know, the top two seconds sections are essentially the same height. And then the bottom one is the same height, too. But I guess it's variable in the fact that you can scroll to see more playlists. That could be one more place to take it.
Starting point is 00:54:28 I've done some work to get it to work, to make sure it works on mobile. And it does work. But yeah, I think the touch target issue is pretty devastating. You can't really click on anything. Although it does bring to mind, I don't know where it is you know back
Starting point is 00:54:45 when the iphone was you know still like a myth that you know people were doing all these mock-ups of what an iphone would look like based on you know like what a mobile phone looked like and what an ipod looked like but someone did this like mock-up of a like hardware web amp or hardware winamp um which is i'll see if i can track it down maybe it's gonna stick in the show notes but it's pretty incredible it's it's literally just like a little you know candy bar size hardware device that looks like winamp ui on the top with like a headphone cable coming out of it yeah definitely share that with us and we will add it to the show notes let's talk about the name you just mentioned web amp again we've been calling it winamp2.js surely there's a story there there's always a story
Starting point is 00:55:28 so winamp2.js was i guess the name i came up with originally just because i thought it it was the most terse explanation of what the project was right it's winamp2 in javascript JavaScript. Um, and shortly after I, I tweeted it that first time the, I, I got a tweet response from, um, Tom Pepper, who I guess was one of the very early people at Nullsoft along with Justin Frankel. And he said like, Hey, congratulations from Nullsoft. Uh, we have these domains if you want them. Um, so that was webamp.com.org and.net and I guess I think they maybe had some internal project
Starting point is 00:56:10 or something like that at some point doing some kind of web thing and it never came to fruition and I don't know how he came into possession of those domains or whatever but yeah I guess there was a long story short there might have been some legal
Starting point is 00:56:25 complications about getting me those domains, but I have them now, um, except for.com, which, uh, I got scooped up, but so I thought it was very cool to one, have like a much more shareable URL than it was currently like on my own jordaneldridge.com, uh, domain with, you know, three sub directories down. Uh, so I thought I might as well take advantage of these uh this domain because it seems like a cool place for it to live um but i guess i haven't fully committed to changing the name and and you know introducing the complete confusion of uh you know like you said news articles or other things that talk about it as Winamp2.js. And then that not being the canonical name anymore.
Starting point is 00:57:09 But I, you know, it felt, it felt like a code name or something. The new name, but it's, I guess it's like too late now. There's going to be confusion. It's just a matter of like,
Starting point is 00:57:19 where does that confusion live? What's crazy is that you create this thing, you tweet about it. And then the originators of null soft what did you say his name was again uh tom pepper tom pepper i love that name too it's such a cool name i think tom pepper reaches out to you and says hey i got some we have some domains we can probably give you so why did you not get the dot com what happened there um let's see how do i how do i phrase this so uh i wasn't able to actually he wasn't
Starting point is 00:57:46 able to actually give me the domains um but in the intervening years they did expire uh rather conveniently but i wasn't watching closely enough i see okay so it's a bit delicately put but that's that's what yeah i'm reading everybody else read between the lines there we're not gonna repeat it because it's just not it's because it's just too close. But this is crazy though. So like a long time ago, you kind of got nostalgic and you wanted to play with this back in whatever, you released this 2014. And then now you're doing this. I think this is such a crazy journey. This is open source at its best. It really is. There haven't been a ton of contributors. I can say there have been people who have popped in and done a thing or two that they thought was interesting. I mean, I think most notably the addition of actually parsing the skin file in the browser using that JavaScript library was a very early pull request um but i think the the amount of input that has
Starting point is 00:58:50 influenced you know how it's evolved has been really tremendous just people you know popping up and be like hey did you know like this obscure thing about the web audio api that would allow you to do this other thing that you probably want to do. Um, and so, you know, it really has been, uh, you know, like while most of the code has been commits that I've written myself, the, a lot of the core ideas or breakthroughs did come from people in the community. And the, the, the, the attention that it got has really enabled that in a way that I certainly, you know, without people knowing about it, their ability to come in and lend their particular expertise, I don't think would be possible. It may not be
Starting point is 00:59:31 open source traditionally in the fact that you said there's not that many contributors. However, you know, it's not as if like this is code you have behind the firewall, nobody can see. And I think that is inviting for those with knowledge to contribute whether it's a direct code contribution or a hey did you know about being open source in the open with no at this point i assume commercial intentions you know it's that's that's that's the cool thing like why would you do this not open source that it would only make sense to do it open source. Yeah, I think, you know, a lot of people who are friends of mine or whatnot have seen, like, oh, man, like, you got, you know, I think when it got a tech crunch, that was, like, it felt pretty hilarious to me that something like this would get written up in a publication like that.
Starting point is 01:00:22 But, you know, when I was telling my friends, you know, how cool that was and they're like, wow, like now that you've really, you know, hit the mainstream, like I've made it, are you going to start putting ads on there? You're going to, you know, what's your, what's the monetization strategy? Uh, yeah. Okay. Wait, wait. Yeah. What's the monetization strategy? How are you going to make money from this? I know what it is. You just sit there and wait for AOL to come. Right. It'll happen. And they're like, no, wait. Don't we already own that?
Starting point is 01:00:50 Haven't. Now they told it off. They'll buy it again. We'll buy it again. One more try. Very strictly do not have any interest in that. I guess, you know, the answer to my monetization strategy has been to do something really interesting, hope that people who know or who care see it, and then that that has like a positive influence on my career trajectory. And that actually is directly true in that my current job at Facebook was the result of a recruiter reaching out who had seen this project.
Starting point is 01:01:26 And then in my interview loop, I think two of the engineers I talked with had seen it. So it gave us something really interesting to talk about. So I guess don't discount just having something be visible as a monetization strategy by just improving your know, and of course, I think all of that is secondary to all the things I learned working on the project. How much of this overlaps with things you do day to day? Like how much of have, has what you've done at day job, either at Facebook or elsewhere, you know, kind of led back into this or vice versa? It's actually, yeah, I think the vice versa is actually more the case in that I started working on this project and then I got really into JavaScript.
Starting point is 01:02:08 And, you know, in order to do some of the things that I wanted to do here, I had to dig pretty deep into understanding the language and, you know, some of the web APIs and whatnot. And I got really fired up about JavaScript. And at my previous company, the sort of state of the JavaScript code base was a little bit lacking. And so then I sort of got on this warpath about improving things there. And then that led, you know, to me sort of evolving into a very JavaScript centric role there, sort of heading up the JavaScript infrastructure at that company. And, and then of course, that had a feedback loop to learning a lot more. So I think it really was like, you know, this project gave me the impetus to go really deep on some of these things, which then had value in my career. And then there was a feedback loop on top of that.
Starting point is 01:02:56 What you're not condoning is that the only way you get hired is by having side projects, right? No, I'm not condoning that. But you're saying that it could help i do think that um finding something that you're that you're passionate about um and certainly if you ideally like you should do that at your work and ideally you can do both of those things too right like you can you can have a project at work that you really care about and you can have um you know other things on top of that if you wish. Um, but you know, I think in the interview process, having something that you really like have, like you're, you're fired up about, um, and that you've thought about in that
Starting point is 01:03:38 like sort of all consuming way, I think comes across. And whether that thing is like, because you were able to find that alignment with your day job or whether that thing is something that you found, you know, on the side is, is, you know, certainly a personal choice. So I'm a big fan of experimentation myself. And in fact, if, uh, people listen to our previous episode, probably two episodes back now about live coding on Twitch with Suze Hinton. You'll be happy to hear that she has convinced us to actually begin live streaming some code. And I've had a couple of sessions now
Starting point is 01:04:14 committing to doing some experimentations every Monday afternoon, roughly, US time. Two o'clock, you'd be on time too. I guess. Well, two o'clock central. I like to, US time. 2 o'clock, you'd be on time too. I guess. Well, 2 o'clock central. Yeah, Monday. Which is like 4am Australia time. Which I found out
Starting point is 01:04:35 by one of our Australian friends in Slack who was a bit disappointed, but I think he understands. I think if you live in Australia, you're kind of used to a lot of stuff happening in the US. Well, the cool thing is you got the Australia, you're kind of used to a lot of stuff happening in the U S. Well, the cool thing is you got the playback though.
Starting point is 01:04:47 You got the videos going on. So the first one you didn't, but the second one you did, so you can get the playback. That's right. So if you're interested in that, uh, twitch.tv slash change log underscore.
Starting point is 01:04:57 If you, if you know us and you like us, give us slash change. Somebody out there. Get that underscore out there. Nobody wants it. For the time being, change log underscore, of course. You can also just go to our website and find a place to click on that.
Starting point is 01:05:12 Follow us on there if you want to live code with me on Monday afternoons. And I've been hacking on Winamp to JS. So Jordan had a sweet idea, which has kind of morphed into what we talked about earlier with the webamp.org slash changelog view. But how can we get a specialized player, maybe even on changelog.com? And so we've been experimenting with getting WinAMP 2 loaded into our site and running. And I'm happy to report that that worked, and it played one of our episodes served locally. But it hit some road bumps.
Starting point is 01:05:52 As Jordan said, there's people that are hacking on this, but not too many outside contributions. So the thing that we hit first and are still kind of stuck at is there doesn't seem to be much of a public API. It seems like the way you built it, it's very much for the single use of I'm loading a single page with just this on it in the middle, which hilariously also threw me for a loop because instead of it being in the middle of the viewport, it's actually in the middle of the page and you're not used to there being a scroll while our homepage is quite long. And so it took me 15 to 20 minutes to realize, oh, it's actually working. It just like completely outside of the viewport. That's funny. Which was funny.
Starting point is 01:06:28 I missed that live stream, so I missed that. Yeah. The video is out there. I think it's about like an hour and four minutes or something. I linked it into our Slack. But it made for one of those joyous programming moments when you realize something is working, and then you also realize you just wasted a half an hour thinking that it wasn't working. Jordan's laughing over there. He's enjoying it. Well, Jordan was actually kind enough to hop into that live stream and actually give me some feedback as I was dorking around with the code and trying to figure out how to use it.
Starting point is 01:07:03 So that was fun as well. But when we talk about what's coming down the roadmap, my hope is some sort of API so that we can at least invoke it from an outside party. Maybe pass it some metadata in a track or a playlist or something. I think the common wisdom is that open source works really well for libraries and not very well for applications. And I think this is sort of in a middle ground there where it's not quite low level enough to work with most of the abstractions that open source relies upon. and and having a like actual ui widget that works on other people's pages that that people can just like npm install is i think not um i think like i guess like web components was supposed to try to solve this but this is not a problem that's very solved so you know like i said earlier i actually have to like inject style
Starting point is 01:08:05 sheets into the dom in order to get this thing to work and while i try very hard not to you know step on anyone else's toes you know there's certain certain things that are just a little bit hard to figure out how to do uh on other on other pages but yeah it's something i'm very i'm very open to and i think there are people who are playing with it. Um, what is it like? Uh, let's see if I can find it. Like 98.js.org. Um, there's a guy who's done a really amazing, uh, JavaScript clone of, um, MS paint. And he has this like entire windows 98 clone going on at 98.js.org. He's included Winamp there. And there are some other, I think, projects that are similarly trying to pull it in. And yeah, I would love to get it to work.
Starting point is 01:08:53 And it should. And we do have some kind of public API where you can load it pre-populated. But I think there is a little bit of a question as to like, okay, well, if it's its own UI, how should you be able to control it from another UI? And I think at this point I'm looking for people who have use cases that they can show to me and say, like, this is how I want to use it. And then I would really like to add those APIs as necessary. Because all the logic's there. It's just a matter of exposing it in a way that doesn't expose internals that I want to be able to change in the future. Sure. Yeah, well, I'm happy to report that in terms of CSS clashes or anything like that,
Starting point is 01:09:32 it worked surprisingly well. There was a little bit of a Z-index issue where some of our avatars are on top of it, and I could just change in the console, I just changed the z-index to a really high value on winamp and that fixed that it's the the positioning uh that was problematic and I don't I'm sure I could probably override some css to to fix that as well and then really just the ability to just like pass it a track and say play as opposed to like right now the only way you can do that is right on initialization. It would probably be enough for us.
Starting point is 01:10:08 But yeah, our use case is, I don't even know if we'd ever even ship it. I would have a hard requirement of lazy loading it when somebody invokes it from our onsite player because I wouldn't want to ship that every page load because like 0.1% of our users would ever click on it. So we'd love to get it working and probably we'll continue to hack on it in upcoming Monday afternoon sessions.
Starting point is 01:10:32 It's a thing I've been thinking about for sure. And it actually has influenced somewhat the architectural choices that I've made. So I actually do, you know, there's like a Winamp class internally, which then I, you know, consume on the pageamp class internally which then I you know consume on the page itself so for example the Dropbox integration it's not actually part of the core library but that's a like an API that I exposed to myself
Starting point is 01:10:55 such that I could inject it on the web amp org page very cool anything else aside from you know me bugging you to add apis that you have planned like this is where i'm taking it are there aspects of winamp 2.9 that it doesn't do or their grand plans for the future or do you feel like it's yeah i'm definitely like approaching the the limit of getting everything of these main three windows working. And so on one hand, that's exciting, but on the other hand, it raises this issue of like, okay, what's next?
Starting point is 01:11:33 So there are people working, or there's at least somebody working on an Electron app, which would be one interesting place to take it. I'm a little bit skeptical that something that's like, wow, that's so cool in the browser, as soon as it's an Electron app, the response like oh god electron javascript everything is slow like i remember winamp winamp was fast this is not fast and that there's going to be this sort of like uh like i don't know like an uncanny valley uh i don't know if you know like that notion in like
Starting point is 01:12:03 uh 3d rendering that like as things get more and more real, eventually they reach a point where they're so real, but not quite real enough that they become very disconcerting. And I worry a little bit that if this does actually get packaged up as a desktop application, that something which felt like a very detailed and accurate reimplementation in the browser is going to feel like jarringly not quite right on top. So that's one thing that I'm thinking about. The other one, of course, is that Spotify thing, although I don't think that that will ever really can ever quite be right due to the DRM limitations. But the thing I'm actually more interested in is there's this, one of the, I think, other iconic things about Winamp was the visualizations. There were these very ornate visualizers.
Starting point is 01:12:58 I think the most notable one was called Milk Drop, which would do these psychedelic visualizations of your music in real time. You'd sort of see the screen undulating in beat with your music. And all that stuff should be possible in JavaScript. So there's a guy here in the Bay Area who's done a project called butterchurnviz.com. And it's basically a JavaScript reimplantation ofimplantation of milk drop which was one of these visualizers um and we've we've gone back and forth a few times i think he's interested in trying to integrate it um but he's you know been busy and it's not his project is not open source
Starting point is 01:13:39 so i can't just jump on it um and then there are some – the other main visualizer, which I think was built in to Winamp, was called AVS. I don't know what it stands for. But that actually did get open sourced as Nullsoft sort of got acquired or whatever. So the C or C++ source code is out there. And there are some people working on the JavaScript part of that. And there's also someone working on like a web assembly transpilation. I was just going to say that might be a good use of web assembly. And there's a, yeah, so there's some talk of trying to get that to work.
Starting point is 01:14:19 And I would really love to see that because the AVS worked with these presets, which were these like declarative files that that people you know these like i guess in the same way that skin authors would be distributing these skins they had made these preset authors would be distributing these visualizations and similarly there's like no place to go experience those anymore and so it would be really cool to offer you know a home for those things that could be you know revitalized on the web so those are the things I'm thinking about. But I would love to see if anyone else has any other ideas of places that we could take this or other things like that.
Starting point is 01:14:53 What a journey. I mean, just one side project away. And then next thing you know, down the rabbit hole, all this fun, Facebook, archiving the web, going back into history, hitting up old forums, resurrecting skins, tweeting them even and loading them via URL. That's it's an interesting path. And then also, like you said, the vice versa on the learning process of like, you know, taking what you've learned here and applying it to stuff you do at work is it's crazy. It's just crazy. I'm'm impressed very much it's been pretty amazing i think how how much has unlocked uh contact with different people i think that really has been the one thing that um you know i'm a self-taught engineer and i spent a lot of
Starting point is 01:15:41 time doing contract work outside of what i felt was sort of like the developer community. And in fact, it's funny to mention this. I remember listening to this very podcast, you know, before I really had any friends in the industry and being like, oh, this is what like real engineers are talking about. And so you're talking about this podcast? Yeah, the Change Log podcast. What? Yeah, I'm serious. Tell me more. I'm listening.
Starting point is 01:16:09 Not this episode, I hope. It's a time travel story. I wish it was. Not that your story is not good, facing to you. You know, and feeling very isolated and not knowing, you know, whether engineer or not, whether, you know, these like PHP website, WordPress websites I was slinging were, you know, garbage or whether github and um you know and then getting to meet you know actual other engineers who have thought about these things and and connecting up with people i think it really is like the human network has been like the long-term benefit of this project like the people i've been able to meet the um you know the people i've been able to learn from um because
Starting point is 01:17:01 that's stuff that i you just you can't self you know, you just, you can't self, you know, there's certain things you can't self teach without, uh, you know, learning from other people. And so I think that's been no amount of money can buy that. Totally. Yes, exactly. And, um, so having this like community and getting to build this community of all these people who have, you know, related interests has been really pretty incredible. That's awesome. I'm glad it's come full circle here and you've been able to, one, be a listener. Bummer on being isolated, but thank you for letting us be a resource for you
Starting point is 01:17:33 to not feel so isolated. And three, just kind of continuing that journey and then ultimately coming on the show and sharing this cool story. I mean, that's, I'm kind of touched, man. That's awesome. Yeah, when you guys reached out on Twitter, I definitely was like, play cool, play cool. But yeah, I think, you know, finding, finding your community is really important. And, and for
Starting point is 01:17:57 me, a big part of that was, you know, you know, learning podcasts and other things like that, you know, blogs and whatnot. And then, you know, as you do more things and other things like that you know blogs and whatnot and then you know as you do more things and get more things out there being able to connect up with real people and not being afraid to reach out and say like hey you know what's up let's talk yeah hey what's up come talk i like that well jordan thank you so much i mean this ending here is is uh super special because I didn't know that you were a listener and what we just shared there. That's really cool. And I'm so glad that Jared and I get the honor to host this show and then have listeners like you and others listening to this show and being changed, being transformed, being welcomed, invited by it because that's what we try to do ourselves. And that means a lot to me to hear that. So thank you for sharing your story.
Starting point is 01:18:52 Anything else you want to share before we call the show? I think I'm just very, like I said, I'm very, very cool to be on here. And thanks for all the work that you guys do. Cool. Well, thank you. Call this show done. Thanks for listening, everybody. All right, that's it for this episode of The Change Log. If you enjoyed going back in the past to learn about Winamp and WebAmp and HTML5 and JavaScript and all this fun stuff to make something nostalgic come to life through open source, this fun project for Jordan is just this fun to go back into and dive into. It's a lot of fun doing this.
Starting point is 01:19:27 If you enjoyed this, share it with a friend. Read us an Apple podcast, go on overcast and favorite it. Whatever you use, like it, favorite it, share it, tweet it, whatever. Do us that favor. And also thanks to our sponsors, Rollbar, Linode and GoCD. And of course, bandwidth for changangelog is provided by Fastly, so learn more at Fastly.com. And we move fast and fix things here at Changelog because of Rollbar. Check them out at Rollbar.com.
Starting point is 01:19:55 And Changelog.com is hosted on Linode servers. Head to Linode.com slash Changelog. Check them out. Support this show. This show is hosted by myself, Adam Stachowiak and Jared Santo editing for this episode is by Tim Smith music is by Breakmaster Cylinder and you can find more shows just like this at changelog.com or on overcast or have a podcast or wherever you get your podcasts that's it it's over thanks for listening and we'll see you next week.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.