DAN: Hello from the Tel Aviv at war.
CHARLES: Steve Edwards.
STEVE: Buenos dias from a cold and clear Portland area.
CHARLES: AJ O'Neil.
AJ: Yo, yo, yo, coming at you live. Yeah, that's it.
STEVE: looks like a floating head. You can make it floating talking head, right?
CHARLES: you can you can't. It would blend a lot. Anyway, we have a special guest this week. That's salty. Oh, salty. Oh, I'll just call you. Oh, do you want to introduce yourself?
SALTY: Yes. Uh, so, uh, like, uh, hello from Thailand. So, uh, my name is arm. Uh, it's kind of hard to pronounce, but. That's how you pronounce it. So basically I am an open source developer, a maintenance of Alicia and working at Dequeal. If you're familiar with like, GraphQL, you call something like that. That's like what we, what, what, what people from where I'm working at created or something like that, but yeah. So overall, that's, that's it.
STEVE: I would like to point out for the record that it is approximately 1 40 in the morning his time. So I appreciate that.
SALTY: Thank you.
AJ: Oh, wow.
Hey, folks, this is Charles Maxwood. I've been talking to a whole bunch of people that want to update their resume and find a better job. And I figure, well, why not just share my resume? So if you go to topendevs.com slash resume, enter your name and email address, then you'll get a copy of the resume that I use, that I've used through freelancing through most of my career, as I've kind of refined it and tweaked it to get me the jobs that I want. Like I said, topendevs.com slash resume will get you that. And you can just kind of use the formatting. It comes in Word and Pages, Formats, and you can just fill it in from there.
CHARLES: So I'm just gonna jump in here and say some stuff, mainly because like Elysia or Elysium, it's from literature actually. And anyway, I remember reading Divine Comedy with where they go on the Elysian Fields. And anyway, cool stuff. But that's all we're talking about. What is Elysia.js? Do you wanna just give us kind of the 10,000 foot view?
SALTY: Let's start with the name first. About the name, there's a word called Elysia, right? It's kind of some literature that I read when I was younger, maybe 10 or 11, sometimes around that. If I recall correctly, it's a very nice story about something about love or something like that or something like that, but I I just like forgot how all the things went, but I remember that I liked it a lot so when I was like working on some stuff, I usually tend to like oh I remember that I like this word a lot and there's like some story behind it Maybe I forgot it, but that but that's fine I only like remember that I like this word a lot, so I just like put it on there but on the technical side, Alessia is like a backend framework for like front-end developers, which is kind of weird because before I get into the backend, I was a front-end developer before getting to the backend and I found that the backend is kind of hard because in the front-end, we have a lot of toolings like TypeScript, a bundling step or something like that. And in the don't have some tooling to improve the kind of like, durable experience a lot. So when I was starting with backend, I kind of like very frustrated our Express, FuzzyFive, and Nest.js. I found that it's quite hard to like setting things up. So I just like want to create something that is like, maybe a little bit easier and then like borrow some term from front-end development that can make like front-end developer for you at ease or something like that. That's why I create something like, if you are familiar with gRPC, there's like a server library and a client library that allow you to like use server, allow you to like get some type from server and use it on client, which like simplify a lot of data calling module like over network a lot of that. It is like, it's like simplify a lot of things. And it's like calling just a function and then you call, you do some networking stuff in the, in the between. And then it just makes it magically appear in the front end. That's like, that's how I start building this stuff. But that's, that's all.
DAN: So I have to just make a comment on the name as well. First of all, if anybody saw gladiator, the movie. It's actually mentioned there because the Elysium field was like the Roman Valhalla. It's like where you went when you died. Like the sort of a grassy heaven it was portrayed in the movie. And the other benefit of picking that name is that you manage to score Elijahjs.com which is not obvious for a lot of open source projects. A lot of developer projects have to settle for dev. or dot IO or something like that.
AJ: So there's no settling for.dev. That devs awesome.
DAN: But, but control and
CHARLES: on this one,
DAN: you're better. I'll enter still, uh, still, uh, goes to.com. So that rules. Um, but the, the second on the technical part, you kind of, um, manage to say a lot of stuff in a really short time so because you mentioned the fact that you were looking to create a kind of a replacement for Express and Fastify, and you also mentioned TRPC and type safety. So there's a lot to unpack in what you said really quickly. So maybe we'll do it a little bit more slowly. So the first thing that I want to start with is you mentioned that it's an alternative Um to express and to what's the other one? Is it fastify fasti? I'm always i'm always Confused by I always forget which what's the name exactly aj you probably remember
AJ: Fastify is the one that's far too complicated for the performance that it gives you when you could have used something else instead
DAN: Uh, okay,
AJ: but it was on team fastify for a while
DAN: Okay, so so my first question is this given that express rules so much of web development on top of node. It's what's the motivation for creating yet another alternative for it? Like why isn't Express or Fastify or one of the other alternatives good enough? Why do we need another one?
DAN: So rather than building on existing ad hoc node APIs, you're using the quote unquote, well, not really quote unquote, the standard APIs that are provided by the Winter CG. Is that what I'm understanding? And that makes it possible to run Elysia on any Winter CG compatible platform without the need for any sort of a compatibility layer that adds overhead and complexity, correct?
SALTY: Yes. Yes, that's correct.
DAN: In that case, that kind of leads me to my next question, which is when I look at the ELISA website, the ELISAJS.com, I see that it very explicitly states that it's intended for BUN. So that's kind of contradicts, it seems to me, like the statement that it's compatible potentially with any WinterCG compatible platform. So is it for BUN? Or is it recommended for BUN? Or is it only for BUN? Like, what's the attitude here?
SALTY: Yes, exactly.
SALTY: Yes, exactly.
DAN: Although I do have to ask myself when I'm thinking about the code that you're writing, maybe you can give a concrete example of where you see such a difference. I mean, which code do you write that does any sort of processing that a certain optimization gets it to run faster in core and a different type of optimization gets it to run faster in V8.
DAN: Oh, so object assign instead of spread. Yes Interesting because you would think that they would do more or less the same thing. So it's really interesting that they don't. But it's also interesting because AJ, unfortunately, I didn't participate in that episode where you interviewed the creator of Bun, Jared Sumner, right? That's his name. And it's interesting because it seems that there's a lot of commonality here of really optimizing each and every line of code to try to squeeze out the most performance that you can get. So it's really interesting to see that this project has the kind of the similar philosophy to the burn runtime itself.
CHARLES: I just want to clarify something real quick. This does run on Node.js or does it only run on Bun? It sounded like it's optimized for Bun, but.
SALTY: Yeah, we have a plugin for converting the web standard into the node and then back and forth as I mentioned on the first one. So we have plugin for that. Yes.
CHARLES: Okay. So you've mentioned the Winter CG and some of the optimizations you've made. So have you more or less, I have to say, I haven't done a ton with Express, but it looks a bit different from what I've seen of Express. So how did you decide what approach you wanted to take for things like, you know, routing and, you know, returning HTML and JSON and whatever else you got it able to do?
SALTY: So I want to make the backend framework to just like return it up, just to return a value and then that return value gets sent into the user, that gets sent to user or client. So how it plays work is that you get some contact and then call like, let's point the send and then you send something. If you want to send JSON, you have to like call it respond.json and then pass the JSON into there. But in LECR, I actually want to just like return the object just like normal function and then pass it into the client. And in the client, we have a custom client for like like TRPC to get the value of the function. So if you manage to make the server behave just like normal function and then client call the function get the return value instead of doing respond.json. Using the return keyword is like, very familiar to frontend developer because when you say that it is a function, they don't expect the response to be something like respond.json or respond.send. They expect it to be a value. And then when you use it on the client when you see the server code when front end developer see the server code they just know that oh okay this function this endpoint return a function so it just like no more value there. The second thing is that when you use user.json, TypeScript can't input the return type from there so on the client side we have a custom library for calling the fetch for like something like TRPC, right? If you have ever curious why TRPC doesn't use something like respond.json or respond.send, it is because that when you are using the same syntax, you can't infer type from the server. So you are forced to return the value as a return value instead of pass, instead of like wrapping it into the function. So two key takeaways here is the first one is that TypeScript doesn't like response function. TypeScript wants you to return a value as a value to get the inferred type. The second thing is I want to make it familiar with frontend developer, so when you want to return a response, you just return a value and then it gets converted into a response.
DAN: So again, I'd like to kind of decompose that into two parts. So the first part is that you chose a simple API over, let's say, compatibility with Express. So your intention was not to create the library that is as compatible as possible, let's say, with Express, but rather one that's kind of similar to Express Xbut intentionally not compatible in order to be easier to use and promote certain good programming practices. So that's part number one, correct?
DAN: OK. And the second part is, and it's kind of really highlighted also on the project's home page, is that you really wanted to focus on type safety typing so that as much as possible, like you said, you can infer the types from the actual return value from the server side function. And then on the client side, if you want, you can import those types and get type safety across the wire. Now, just to clarify that to make sure that I understand, you don't. have to use this type safety, right? At the end of the day, it's just a standard HTTP response. So if I'm using just a regular old web client, like if I hit the URL in the browser address line, it'll just work. It will just get a JSON response with the appropriate values. So I don't have to use the type safety. It's a benefit and a feature that I can use the type safety if I want to, correct?
SALTY: Yes, exactly.
DAN: Now, this is kind of reminiscent of the conversation we recently had in an episode that just came out at the time of this recording about where we discussed the use of RPC in modern meta frameworks, like in Next.js version 14, or in Quick, or in Solid, where you call functions across the wire and you get type safety provided by the meta framework that you're using. So for example, if you're using Next.js 14, you create a function, you put in it use server, then you can call it from the client and it behaves like a function call and it's type safe all the way, but it's not really a URL. You're literally calling a function. It gets translated into a URL behind the scene. In your case, it's not that. It's similar to that, but it's not that. It has a URL. It has a standard HTTP return value. It's not like masquerading as something else. But you still get the type safety, correct?
SALTY: Yes, exactly.
DAN: And the type safety on the client side is provided by a library that you're using, correct? Which library is it?
SALTY: Yeah, it is called Aden. It is subplugin in the Edizier homepages. If you go into the plugin, it is listed as the first plugin for this exact purpose.
DAN: Is it like a project that you chose or is it like something that you already also worked on or like what's the relationship between Eden and because it kind of both of them reference and Eden. So I'm wondering if it's like something that you also created.
SALTY: Yes, it is something that I also created.
DAN: Oh, cool. So you built Elysium on top of Eden in a lot of ways.
SALTY: So actually I was, I first created Elysium and then I found that maybe it is good if you can do something like TRPC for the server. So I created Eden for that.
This episode is sponsored by Miro. I've been working lately on a whole bunch of different projects for top end devs. Everything from meetups to courses to podcasts to the website. And a lot of the things that I've been working on have gotten really, really messy. And even though I have some software that helps me manage the projects, one thing that I figured out was that it really helps to have a tool that you can use to manage kind of the layout and the organization of your project not just whether or not tasks are being done. And so I picked up a program called Miro and Miro, what it does, I'll just give you an example, when I'm building a course, I sit down and I open up their mind map and I just put all of the information into the mind map. And I'll do that for probably anywhere from 15 minutes to an hour, just depending on what it is that I'm organizing. And then what I can do is from there, I can actually reorganize it and rejigger it so that it actually makes sense. And it really, really helps me get all of the ideas on paper or on the screen in this case, and get an idea around how these things come together. So if you're looking to put together a project or organize some ideas, you should definitely check out Miro. You can find simplicity in your most complex projects with Miro. Your first three Miro boards are free when you sign up today at Miro.com slash podcast. That's three free boards at Miro.com slash podcast.
DAN: I understand. It's kind of similar to Zod in a lot of ways though, isn't it?
SALTY: So Zod is for validating the API, right? So instead of using Zod, I actually use something called Typebox, which is kind of like Zod, but it was like a lot faster, like a hundred times faster or something like that.
DAN: So Typebox is a.. is similar to Zod in that you can specify schema in TypeScript, and then that schema becomes type safe. So it's a type safe way to send data across the wire. And you built Eden on top of that to infer the types from the return values in Elysia. And then you have the return values Okay, now I see what you're getting. So, and effectively kind of constructed a sort of a TRPC sort of a thing. out of all these moving parts.
DAN: By the way, I have to mention that on your home page, you have at the bottom, you have a really nice playground. So anybody who's listening to this podcast and finding it difficult to kind of like follow along, they should just go to the aliziajs.com, scroll to the bottom and have this kind of interactive playground that they can use.
AJ: I do not see an interactive playground. I see a start in minutes and an introduction and a cheat sheet No,
DAN: there's a try
AJ: the try it out not at the very bottom. Okay. Okay
DAN: Ah, so you went even lower Yeah, it's exactly it's almost at the very bottom. Yes.
AJ: Okay. Yeah, so I I had a few questions here uh, one of them was How do you do you deal with headers and streams? Because I think that's the main thing that is not... you can't return... well I guess you could have some way that you return headers as part of your return object. But then streams are also... you know, if you're streaming some data rather than providing the object whole, what's the story for that?
SALTY: So for a stream, you can't actually return the stream, right? So you have to create something called like, uh, uh, what is called a racing or something like that in Node.js. But in order to make that work as like no more value, we create some plugin called AliciaStream, which allow you to create a new function, uh, which allow you to create a new class. And then when you want to return a stream, you call some send method. So that is the only case that you have to use the send instead of return the value. But so that's it.
AJ: Honestly, I can't think of a reason that you would ever use a stream in a web framework in production because typically you're just sending a file. And if you're sending a file, then your web server would send the file. Oh, when you got to do generative stuff, like creating a creating a CSV or a PDF or something like that on the fly. That's the case for...
DAN: And you kind of answered how I would do it in an ideal world. I don't know how difficult it would be to implement in a framework like this, especially given that I've never done it. But like you said, AJ, it's generative. So I would gravitate towards generators as a way to do it. Instead of returning a values, I would yield value.
AJ: Get the hints. Get the hints. Where's my holy water?
DAN: Yeah, but that's what it was. That's what it was created for, really, you know.
AJ: Oh, it was created to confuse people and sound cool.
DAN: It doesn't have to be difficult, really. It's more it's more scary than it seems once you get used to it. But but again, it seems to fit the case exactly like every time you have more content, you yield some more stuff.
AJ: Well, there was another question that I.
DAN: But wait, is it before, before you switch over, uh, um, is, is, is that something that you might consider either doing some sort of either generator or maybe a synchronous iter or returning in a synchronous iterator or something along these lines?
AJ: So good
SALTY: for now, I am going to implement the same and then I will implement the yield keyword later. So we are going to support two ways to do this
DAN: I think, like I said, I totally understand why people are scared of it. But on the other hand, I think it's a lot when done correctly, it's a lot simpler than, than people really worry about it. It's almost magic and how simple it can be. There, there are potentials, potentially some issues with it. Like, I don't know what the performance will be. So, you know, given your performance focus, you know, it really depends how efficiently the engine actually implements all these mechanisms and it can vary a lot. Another potential issue to look at is the push-pull program problem, like how you deal with congestion. You basically want the client to be able to pull stuff and you don't want to create congestion on the server side. It's an interesting question how you control the flow in these types of scenarios. Well,
STEVE: unfortunately, this is the time of year for congestion and colds and stuff. So hopefully there's some good code medicine for that.
SALTY: Okay, sure. I got this question a lot the benchmark called web framework, right? So actually they create an issue on Alicia's site, on our repo you can go find an issue there. The maker of this benchmark request me to have something called like a code review for what they are doing for Alicia and Bon as well. Actually, if you go back, to that benchmark in a month ago around, what is it called? The nine month in English, what is it called? Around before October, there is a benchmark that run on Alicia and Alicia was performing around 100,000 which is around level of Go and Rust. If you click on the top of the pages, you can see that you can scroll back into the data that they did before. If you scroll back to the data they did before, you can see that most frameworks that run on barn and like LHC and HONO, they are performing very very good like 100,000 requests per second. But at some point they actually changed some configuration of the Dockerfile. So how this web framework testing are that they pack the run they pack the runtime and the code into the Docker 5 and then they execute the code. But the problem is that when they create an issue on Alicia repo, they are using PM2 without doing the money process work. So what you are seeing right now at the benchmarking at the benchmark website, they are actually running on single thread. So that is why LCR down to that level because other node run, other framework like Express and Fastify, they are using multiple process to run, to do the benchmark. And for BUN, like framework like LCR and HONO, which for some reason behave like quite slow recently because they are changing the Docker file or some configuration or some hardware that I am not aware of but I actually created an issue for that on their report fix.dat and I am taking a look into that issue so I can assure you that previously around a month or two months ago they are editing and performing a lot faster than it is now.
AJ: So I do see that October 3rd. I look at the October 3rd benchmarks and I see that there, Alicia is about five times faster than express and whatever this benchmark is, which, you know, who's, who knows what that is, but yeah, that that was exactly my question is, you know, like the benchmark here, you know, this is multi-threaded, multi-core versus an actual deployment environment. If you're measuring wide, it's different than if you're measuring, you know, Horizontal measuring is different than vertical measuring. Here you're doing vertical measuring. There they're doing kind of a hybrid. They're giving you, they're doing horizontal measuring, but only measuring one instance of the horizontal measuring, whereas you are doing vertical measuring. So yeah. Okay. That, that makes sense. So, but in practice with an actual application, if you implement, let's say a to do app, well, I don't know if that's even really enough, but let's, you know, if it's a to do app that connects to the database and has some items that you've, you have some application implemented in both express and in Alicia, what, what do you think is the real difference in performance and is even, is that even like as big of a deal? Cause again, you could just go with go if you were really concerned about performance or, or rust, if you're hyper concerned about
SALTY: So, about Alicia, so we have like, if you do something like that to do, like some simple to do list for this case, they, if you compare it to node, like Express and Falsify, they are not going to have like a lot of different, like 10 times different, it is not that case, because they are, if you do something like database calling, they are going to have some overhead over there too. So they can never get up to 10 times faster or 20 times faster. They never did that in the real world with database calling or something like that. But if you do something in memory, like maybe...
AJ: Which is your edge functions, your winter CG stuff?
DAN: Or just using Redis.
SALTY: Or something like that and so, yeah,
AJ: And by the way, this does, on the benchmark that I'm looking at from October this actually outperforms the framework I use in Go and a number of other popular frameworks in Go. So just to clarify that when I said, Go might be faster according to these benchmarks, most of the Go frameworks are actually slower than Elysia.
DAN: And the other thing is that if you're looking currently at the edge function world, that's almost by definition like it's going to be no. Well, not node based, but
AJ: I think you're using the edge in the first place because it's really cool right now.
DAN: Yeah, that's probably true. We, we, we had the whole episode where I was, we, we had, uh, Galsh Lezinger from, uh, for sell and like the whole episode, I was trying to get him to say like, what was the killer app for edge and I don't recall that I got an answer of
AJ: investor money, investor money is the killer app.
DAN: Yeah. Probably. Um, yeah. So what I'm, what I'm getting is, is that here? is a really nice to use library that's an alternative to Express, that in a lot of ways has a much simpler API, it's type safe across the wire, and it also happens to be a lot faster. Now, you put faster at the top because it's sexy, but for me, it's more of the like, like the icing on the cake in a lot of ways.
SALTY: So basically because like a lot of developers say that node is slow. So I kind of want to destroy that. That that pressing. So that's why I put the performance on the top because it catches a lot of eyes easier than saying I have something like maybe open API support or something like that.
CHARLES: But are your benchmarks running on bun or are they running on node?
SALTY: Ah, uh, the benchmark is running on bun But for express, we also have BUN version and Node version as well.
DAN: So all the tests that you're showing are on BUN, correct?
SALTY: There are some other frameworks like for HONO, they actually work with a lot of runtime like BUN and DENO as well. So I kind of run on the other runtime as well, if the framework supports, so there's like Express on the BUN and Express on Node, or HONO on DENO or HONO on BUN, and then compare the performance difference.
DAN: I hope I don't get hate for this. We actually even use Nest at Next Insurance where I work, and I really don't get the like why people like it so much. Uh, I'm not, I'm not a nest person. Maybe it's, you know, I'm not big into decorators. Maybe it's that.
CHARLES: Maybe we need to get Kent on to talk about why we'll never use nest. You wrote a blog post about that.
DAN: Well, he spoke about why you should never use next. Not why you should never use nest.
CHARLES: No, right. Yeah, you are correct. I mixed them up.
STEVE: So are you saying that's just for the birds then?
DAN: Yeah, maybe. I don't get the appeal, but maybe it's just me. But again, so going back to Elysia, so we said it's potentially like 18 times, let's say in order of magnitude faster than Express, and let's say several times faster than Fastify. So if you're concerned about performance, you've got that covered. It's got a much simpler API, at least for the non-streaming scenario. It's type safe. Oh, and I see that it's also open API compliant.
AJ: And that's just the new name for Swagger, right?
SALTY: Yes. Actually is, is, uh, the standard for that Swagger build on, but, uh, mostly we open API for Swagger.
AJ: The standard that they retroactively built it on after they turned it into the standard.
SALTY: Yes. But it is nice to have because like in, in all my previous work that I was done with like freelancing, uh, I was using Fastify and it is very hard to get it make it work with swagger and make it work with TypeScript. So when I have to change the schema, I have to change it on both TypeScript and change it on the falsify schema and then change it on validation library. So I have to change a lot of that and there are like a lot of frequent change. So I try to make it like defined by using one single schema, which is the type box that I was using and then it does support the OpenAPI schema to generate the record as well. So that is really nice to have to let the manager or senior programmer see that what are you working on or something like that.
AJ: So how do you deal with headers? I don't think we actually rounded that question out.
SALTY: Ah, yes. So for headers, if you are familiar with code.js, when you get a request and response, everything is done through context. So you can, so there's two case. If you want to set the header, you can use the context.set.headers to append the value to the header. The second one is that you can explicitly return something called new response. And that class is a standard that built into WinterCG standard. So you kind of get that for free. And if you want to return a value, the second parameter of the constructor, they accept something called headers. And then you can add the headers to that as well. But you can choose return each one if uh, each one you like. But the good thing about Alicia is that Alicia tried to like, if you're working with cores or something like that, you don't have to explicitly set the headers because like plugin already set it set it there for you.
AJ: And so does it, how does it know? Well, I mean, generally you're returning Jason. I mean, like 99% of the time you're returning Jason. But if you did need to return. Text or HTML, or does it, does it do some sort of peeking at the content when it's non object content? Non-object non-stream to be able to tell what type it is or is it JSON by default? Like if I just had a stream and you didn't know what was in the stream, what would the header be?
SALTY: Actually, we, in the Aesir, when you return the value, it actually passed to some function called mapHandler to map that value into a web standard response. So what we did is that we tried to find what is the most common case that developer tend to return, like, If they are returned text with the HTML, which with HTML value, they are the and see all automatically set the response to be a automatically set the content type to be HTML. If the value is the JSON, they automatically set to JSON. And if it is a file, like you, you get it like that. All a lot of kids that we try to try to like automate. But are
AJ: you saying at runtime, it looks at the data and whatever that function returns, it memorizes the type and then just returns that type. Is that what you're saying?
SALTY: Actually we do both. We as I said before, it's actually have a fake compiler to detect the return type and return value. But in case that it can't detect the value, they are using, they are trying to interpret as on the fly.
DAN: And what if I want to just add, I don't know, let's say a cache response header, something that doesn't have to do specifically with the content type, but rather just extra information on top?
SALTY: If you want to add some manual header, you can set a header based on context and context.header, which is passed to every handle in the...
DAN: Ah, okay. So in addition to the return value, if I want to provide some additional metadata, I can do it via a context object that my handler, that's an optional parameter to my handler, as it were. OK, that makes sense. Yeah. I assume you can also use that to do stuff like, I don't know, like a three or four response instead of sending all the data down again or something along these lines or so. And again, it all works really well with the bun really fast system for, let's say, manipulating files and so forth. So I really like the combination of these things together. But I know that it's not necessarily AJ's jam, but I really like the type safety across the wire. The fact that you can post JSON data and get a build time error if you.. If you're, if you're passing in an improperly constructed object is, is really powerful.
AJ: I love type safety. I hate.
DAN: Yeah, that's the thing. It's typescript based. You can't get away from it in this call.
AJ: I don't see any typescript here.
DAN: Yes. You well,
AJ: I'm looking at the cheat sheet. I don't see any typescript.
DAN: No, but again, if you go, if you go to the homepage and you, and you search for typed strict, Actually you you go to end-to-end type safety introducing end-to-end type safety you will see that it passes a string age instead of a numeric age and You and it you get the type error at build time.
AJ: Yes, but that if if you pull that up, there's no typescript there that's that's using the I forget what it was called, but
AJ: it's the type object T dot object T dot string T dot.
DAN: Yeah, but but again, it's a type object But it's but but that's why I said that it's like Zod because yeah It does a type checking it, you know you do it both at build time and at runtime No,
DAN: Oh, you mean you mean the fact that you write t dot number instead of doing the the the explicit typing. That's the thing that you like Well,
DAN: But the nice thing is that because of the way that tools like VS Code work, even if it was like client.js instead of client.ts, you could still probably get the type checking to work.
AJ: So, I was going to call you salty because that's your first part of your handle there. But, hold on, let me, it's just om, right?
SALTY: Yes, yes, it's om. Okay, om.
DAN: It should work, AJ. It just might not be as nice.
DAN: If you want to type safety, you don't have to have the type safety.
AJ: Do you have custom? This is the thing. Do you have custom tooling? Are you using TSC?
SALTY: We are using purely TSC. Actually, I wrote a lot of typescript type. So I actually wrote some compiler based for GraphQL in type level 2 or something like that. Or some tool like that. And then I use that experience to make the same thing with the Alicia.
AJ: Okay, so. If it works with TSC, it'll work in Alicia.
CHARLES: All right, I'm going to push us to picks. I will also say that I like the wild west of the type system in Ruby. But yeah, let's jump in and do some picks. Before we do that though, how do people find you online?
SALTY: Oh, yeah, I do have a Twitter account which has the same name as here, SaudiOM. find me on there or otherwise you can go into Alicia and then you can go to Alicia GitHub. There are links to my GitHub profile as well. But mostly for programming stuff, I usually active on Twitter mostly.
CHARLES: Awesome. All right. Well, let's go ahead and do our picks.
Hey, this is Charles Maxwood. I just wanted to talk really briefly about the Top Endeavs membership and let you know what we've got coming up this month. So in February, we have a whole bunch of workshops that we're providing to members. You can go sign up at topendevs.com slash sign up. If you do, you're going to get access to our book club. We're reading Docker Deep Dive, and we're gonna be going into Docker and how to use it and things like that. We also have workshops on the following topics, and I'm just gonna dive in and talk about what they are real quick. First, it's how to negotiate a raise. I've talked to a lot of people that they're not necessarily keen on leaving their job, but at the same time, they also want to make more money. And so we're gonna talk about the different ways that you can approach talking to your boss or HR or whoever about getting that raise that you want and having it support the lifestyle you want. That one's gonna be on February 7th, February 9th. We're gonna have a career free to mastermind. Basically you show up, you talk about what's holding you back, what you want dream about doing in your career, all of that kind of stuff. And then we're going to actually brainstorm together, you and whoever else is there and I, all of us are going to brainstorm on how you can get ahead. Um, the next week on the 14th, we're going to talk about how to grow from junior developer to senior developer, the kinds of things you need to be doing, how to do them, that kind of a thing. On the 16th, we're going to do a visual studio, uh, or VS code, uh, tips and tricks. Um, On the 21st, we're going to talk about how to build a software course. And on the 23rd, we're going to talk about how to go freelance. And then finally, on February 28th, we're going to talk about how to set up a YouTube channel. So those are the meetups that we're going to have along with the book club. And I hope to see you there. That's going to be at topendevice.com slash sign up.
CHARLES: Steve, do you want to start us off with a high point of the episode?
STEVE: Absolutely. All right. So, uh, still missing my, uh, my rim shots. We got to get that figured out. Chuck. Um, so, you know, in the past I've talked about all the different jobs I've had and how I got fired, you know, like when I used to work for the bank and got fired by pushing an old lady over when she asked me to check her balance. Um, One point I used to work for the circus and I was a human cannonball until they fired me and then recently I bought a chicken to make a sandwich. Turns out it just poops all over the floor and doesn't make sandwiches at all.
STEVE: And then, uh,
CHARLES: do you need your rim shots? I'm sorry.
STEVE: I do. I really need them. And then, um,
DAN: yeah, this is almost sad without the rim shots.
STEVE: Almost. And then, uh, I burned, you know, I'm working on losing a little weight and I burned 2000 calories yesterday. I left my food in the oven for too long.
DAN: Hmm. Yeah.
CHARLES: There we go. I feel like I'm doing this, right?
STEVE: I'll have to get a sound set up. Sound effect on my phone and hold it up or something,
STEVE: Yeah. Those are my picks. All right. Dan, what are your picks?
DAN: Uh, well, given the realities on the ground here, my main pick this week is going to be the anti-missile defense system that we've got going here in Israel just to give it, to put it in numbers, since this conflict began, Hamas has fired, and I'm excluding Hezbollah in the north, just Hamas has fired close to 10,000 rockets at Israel's population centers. So they're intentionally trying to hit our cities, like Tel Aviv or the more southern cities of Ashkelon and Ashdod have suffered a lot of rocket attacks. And what makes it, you know, being basically livable here in Israel is the fact that we've got an amazing rocket defense system. It's actually three layered. We've got the Iron Dome as like the layer that deals with the lower flying rockets. You've got David sling which deals with the mid-range systems and then you've got the arrow Which is for ballistic missiles it which was actually used for the first time in in a in a combat scenario not an experiment or something like that when The Houthis in in Yemen actually fired the rocket at a lot. So it was actually intercepted by an arrow missile now i was actually, when I was in the army a long time ago, I was actually involved in the development of these systems. So I feel an extra level of gratitude and appreciation for what they've been able to achieve with these systems. It's pretty incredible. So that would be my pick. By the way, if there's one part of our economy that's benefiting from all this is the defense industries, because a lot of countries are now looking to buy these defense systems, because they've just proven themselves incredibly well in these times. So that would be my pick. Other than that, the war is still ongoing. And even after all these times, we still get like more information and more videos and whatnot about what happened on october 7th Uh, it's actually I actually watched a video that was released online. I I saw that you also favored it steve Uh, I kind of wished I didn't watch it after watching it
STEVE: Because not the one with the girl.
DAN: Yes Yeah,
STEVE: that's pretty Amazing Amazing more like it
STEVE: it's a better words.
DAN: It's pretty hard. It kind of scars your soul when you when you see stuff like that Uh, it's it's really difficult
STEVE: Yeah, that's what happens when you treat human life as disposable. I mean as with no value
DAN: Yeah Anyway, it is what it is. So the war in israel the ongoing war in ukraine which people tend to kind of ignore now There's actually a lot of stuff that people are.. are kind of ignoring because of the war here. Like there's something that's on the verge of genocide in Dalfour going on right now, and nobody's talking about it. Because nobody cares about them, apparently. And whatnot. So yeah, sorry. Those are my sad picks for today, and I apologize for that. And try to, oh, how can I forget? Uh, just when you think that all the world is doom and gloom, then you've got some comic relief, like what's happening with open AI and Microsoft. Uh, have you been following this? This is pretty nuts.
STEVE: It's head spinning, just watching all the moves
DAN: and really fast recap. The board fired Sam Altman for no obvious or apparent reason, like overnight, as it were for failing to disclose some unspecified information to the board. They literally informed Microsoft was the biggest shareholder in OpenAI, like a minute before the firing. So they literally didn't give them any time to respond to that. Microsoft stock then lost 4%, which is quite a lot given the size of that company. And then they appointed the CTO. to be the interim CEO instead of Sam Altman, I forget her name. And the first thing she tried to do is to hire him back. So the board fired her as well. And then- That's why,
STEVE: I didn't realize that. I knew she'd been, I saw that she had been made CEO. I didn't understand that was why she'd been let go.
DAN: Yeah, something along these lines. And then they brought in somebody else from the outside and then, like on a Sunday night at midnight, Satya Nadala, the CEO of Microsoft, basically tweets that, first of all, we will work with the new management team at OpenAI, but oh, we are hiring Sam Altman to run, to be the CEO of our new AI division inside Microsoft, and he's bringing over everybody from OpenAI. So.
STEVE: I don't know if it's everybody, but.
DAN: Not all the good people.
CHARLES: That is the weirdest acquisition I've ever heard of.
DAN: Yeah, some people are now speculating that my maybe Microsoft instigated all this thing just to, you know, not be dependent on open AI is an external provider and just bring everything in house. Uhm, by the way, what is Microsoft stock doing today?
CHARLES: I would.
DAN: After these. Well, it's up two and a half percent almost. So yeah, so apparently the market likes that news. Um, anyway, it's, it's, it's the weirdest thing. Some people are actually speculating that maybe they're kind of grooming, uh, Sam Altman to replace that in the dollar virtually. Like, I don't know. Anyway, it's funny times. So at least I'm finishing with and with an upbeat pick. So yeah.
CHARLES: Yeah, I just caught the tail end of that on Twitter.
DAN: Oh yeah, you've got to love Elon Musk's response to Setia Nadala's tweet about this. Basically saying that now Sam Altman and his team will have to use teams for their online conferencing.
STEVE: Yes. Oh, that was so good..
CHARLES: Four souls.. All right, AJ, what are your picks?
AJ: All right, so first and foremost, metal shower head. So I don't know how many people have this problem. It seems like anybody who buys a shower head with a plastic shower head holder would have this problem. But our, cause the shower heads, you know, they, ah, and then the plastic pieces break, right? And then, so anyway, we bought metal showerhead holder and the thing was like almost the same price as a new showerhead, but now we'll never have to buy another one ever again. And it even came with the Teflon tape that you need to make it so it goes on smooth and doesn't have any leaks and stuff. So yeah. So metal shower head holder. I don't know why I didn't buy one of these months and months ago. Cause ours has been broken for a long time and we just kind of like have it balancing in the shower just right. And then, but the thing is, because they're not, it's not a standard size. I like was really demotivated to go look for one because they're, you know, and of course the company that we bought the shower head from, they're not, they don't have replacement parts, you know. So anyway, but we got, we got this, I think it's like the only all metal shower head that's available for purchase on Amazon. It's I think $27, but totally worth it. And no, it doesn't fit perfectly because there are no standard sizes for these things, but it fits good enough. You know, it's not like, it's not going to fall out. It just doesn't have that perfect look of... fits all the way in. So that's one. Number two, that should be number one, is Super Mario RPG because it's the best game ever! I mean it rivals Link's Awakening. Maybe surpasses it. I don't know. That's a tough call. But...
DAN: I'm going to interrupt you for a second and just say that I have to drop off. So... Bye bye to everybody and I'm ready... Thank you for coming on. It was super interesting and it looks like a really great project and all the best with it. So bye everybody.
STEVE: Yeah. I just listened to him on another podcast because whiskey web and whatnot. Interesting to hear him talk. He's pretty sharp. It's fun to listen to
CHARLES: All right, I'm going to jump in with my picks here. I'm going to pick a board game first. Now, I've mentioned that I help teach games at Timcon and Provo, and this is one of the games we taught. This was not my favorite game, but it was fun. I kind of put it on the level of if somebody wanted to play it, I would say yes, but if somebody wanted me to pay for it, I would say no. And it's called Astra. And what it is is you have constellations and you're trying to complete the constellations. And so they all have a starting star that you start on and you trace out the constellation, whoever finishes it gets constellation in their hand. And then you can use the constellations ability to do different things. And so, um, and if you contribute to a constellation, but you don't win it, then you get a one time boon for completing it. Um, and, Yeah, anyway, you can increase your capacity to cover more stars in the constellation. You can increase your capacity to hold more cards. Anyway, there are different things. It's relatively simple game. I think it took us about an hour to play it. And it has a board game geek waiting of 2.19 and I went to try and find it on Amazon and I didn't see it there. However, it is on board game arena. So if you want to play it on the internet, you can do that. And I do not pay for my board game arena account. And I play games on here semi-frequently. So it looks like this one is a free game to play. So anyway, go ahead and check that out. really digging that. I'm also going to throw in a couple more picks with some of the stuff that I'm fiddling with. One of them, I switched my error tracking over to honey badger honey badger.io. I've been pretty happy with that. And yeah, I've also been having getting some feedback on top end devs on stuff that I isn't quite working quite right on the website. So if you're running into that, let me know and then finally, we are going to be releasing the premium podcasts and meet up some memberships. So keep an eye out for that on Topendevs. And that's what I've got. Ohm, what are your picks?
SALTY: Just, okay, I have one. So around like two days ago, I have Microsoft Thailand invite me to talk about GitHub and.. So I actually made an appointment with Microsoft to talk about it, right? So I had to talk it on stages, but apparently there's a little bit, a little bit of a wrong mark in my calendar. So on that day, I have to speak at Microsoft, Universe, GitHub Universe after party, Thailand. But in that day in the morning, I had to went to the other one, they are hosting a game event, which if you cosplay to their booth, they will give you a lot of nice stuff in return for taking pictures with people around there. So I was cosplaying, I planned to cosplay to the game booth to get the stuff, right? And then I realized that it is organizing the same day. So I have to ask Microsoft if I could, maybe using the cosplay costume to present at GitHub Universe Thailand. So apparently they allowed me to do it. So the unique thing is that this GitHub Universe are organizing in Siam. Siam is like the center of the Bangkok, where every station in Thailand are crossed there. And we are talking in the biggest shopping mall there. So there's a lot of people walking around and then there are some people like, oh, they have some cosplay on the stages, but they can't understand that at all because we are talking about programming stuff and apparently after that Microsoft employee actually DM me and say that maybe there's like a lot of, a lot of crowd actually really happy and participate more than, more than usual. So apparently they also invite me to like another conference in the January and they also asked me to do cosplay again to see if the crown actually like it or not. So just kind of funny story that I have. Yes.
CHARLES: Awesome. That sounds like fun. I love cosplay, honestly. It's fun, especially with my kids. My kids really dig it. I'd love to give a talk in cosplay. Anyway. All right, well, this was fun. I'm gonna go ahead and wrap this up. Thanks for coming.